ComponentOne RibbonButton由后台工作者调用

时间:2012-07-10 16:27:34

标签: .net backgroundworker componentone

我正在尝试在后台工作程序完成时更改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();
    ...
}

1 个答案:

答案 0 :(得分:0)

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