1

バックグラウンド ワーカーが終了したときに、C1 リボン ボタンの SmallImage プロパティを変更しようとしています。

問題は、「クロススレッド操作が無効です: コントロール 'MyControl' は、それが作成されたスレッド以外のスレッドからアクセスされました。」

Windows コントロールで InvokeRequired をチェックすることで、他のクロススレッドの問題を回避しましたが、ComponenetOne コントロールには InvokeRequired プロパティがありません。

調査の結果、progresschange イベントで Controls 画像プロパティにアクセスすると問題が回避されると考えました。以下は関連するコードです。ただし、doWork イベントと progresschanged イベントの両方がワーカー スレッドで実行されるため、まだクロススレッドの問題が発生しています。誰かが私が間違っていることを見ることができますか、それとも問題を解決できる別の方法がありますか?

    private void InitializeBackgroundWorker1()
    {
        BackgroundWorker1 = new BackgroundWorker();
        BackgroundWorker1.DoWork +=
            new DoWorkEventHandler(BackgroundWorker1_DoWork);

        BackgroundWorker1.RunWorkerCompleted +=
            new RunWorkerCompletedEventHandler(BackgroundWorker1_RunWorkerCompleted);

        BackgroundWorker1.ProgressChanged +=
            new ProgressChangedEventHandler(BackgroundWorker1_ProgressChanged);

        BackgroundWorker1.WorkerReportsProgress = true;
    }

    private void BackgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        e.Result = sResult;
        (sender as BackgroundWorker).ReportProgress(25);
    }

    private void BackgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    {            
        MyControl1.ribbonButtonStatus.SmallImage = Properties.Resources.trafficlight_green;            
    }


    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        MyControl1 = new TimeGridControl();
    ...
}
4

1 に答える 1

0

バックグラウンドワーカーを開始している場所からコードを投稿しませんでしたが、progresschanged イベントがワーカースレッドにマーシャリングされている場合。これは、メインスレッドとは別のスレッドから作業を開始していることを意味します。バックグラウンド ワーカーSynchronizationContextは、progresschanged および runworkercompleted イベントで呼び出しをマーシャリングするために開始された場所から をキャプチャします。

于 2014-12-15T20:59:33.250 に答える