バックグラウンド ワーカーが終了したときに、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();
...
}