2012-07-10 47 views
1

我試圖在後臺工作完成時更改C1 Ribbon Button的SmallImage屬性。ComponentOne RibbonButton由後臺工作人員調用

問題是我得到「跨線程操作無效:控制'MyControl'從其創建的線程以外的線程訪問」。

我已經通過檢查Windows控件上的InvokeRequired解決了其他跨線程問題,但是,ComponenetOne控件沒有InvokeRequired屬性。

從研究我認爲訪問在progresschanged事件中的控件圖像屬性將解決該問題。以下是相關的代碼。 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

您是否嘗試過檢查控件容器的'InvokeRequired'屬性(可能是表單)? – ScottieMc 2012-07-10 17:58:05

+0

我已經試過,沒有運氣,正在想辦法解決這個問題,因爲沒有其他人看起來可以提供幫助。但感謝ScottieMc的回覆。 – 2012-08-01 12:01:59

回答

0

你沒有發佈你開始你的backgroundworker的代碼,但是如果你的progresschanged事件是編組到工作線程。這意味着你從其他線程開始工作,然後從主線程開始工作。後臺工作人員捕獲SynchronizationContext,它從開始處理progresschanged和runworkercompleted事件中的調用。