我正在尝试在后台工作程序完成时更改C1功能区按钮的SmallImage属性。
问题是我得到“跨线程操作无效:控制'MyControl'从其创建的线程以外的线程访问。”
我通过检查Windows Control上的InvokeRequired解决了其他跨线程问题,但ComponenetOne控件没有InvokeRequired属性。
从研究开始,我认为访问progresschanged事件中的Controls图像属性可以解决问题。以下是相关代码。 doWork和progresschanged事件都在Worker线程上运行,但是我仍然遇到了跨线程问题。任何人都可以看到我可能做错了或者有其他方法可以解决问题吗?
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();
...
}
答案 0 :(得分:0)
你没有从你开始你的背景工作的地方发布代码,但是如果你的progresschanged事件正在编组工作线程。这意味着你从另一个线程开始工作,然后是主线程。后台工作程序从progresschanged和runworkercompleted事件中捕获SynchronizationContext
开始编组调用的位置。