1

当后台工作人员完成时,我正在尝试更改 C1 功能区按钮的 SmallImage 属性。

问题是我得到“跨线程操作无效:控制'MyControl'从创建它的线程以外的线程访问。”

我通过检查 Windows 控件上的 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();
    ...
}
4

1 回答 1

0

您没有从启动后台工作程序的位置发布代码,但是如果您的 progresschanged 事件正在编组到工作线程。这意味着您正在从另一个线程开始工作,然后是主线程。后台工作人员捕获SynchronizationContext它开始编组progresschanged 和runworkercompleted 事件中的调用的位置。

于 2014-12-15T20:59:33.250 回答