2012-07-10 3 views
1

배경 작업자가 완료되면 C1 리본 버튼의 SmallImage 속성을 변경하려고합니다.배경 작업자가 호출하는 ComponentOne RibbonButton

문제는 "크로스 스레드 작업이 유효하지 않습니다 : 컨트롤 'MyControl'이 (가) 만들어진 스레드가 아닌 다른 스레드에서 액세스했습니다."

다른 크로스 스레딩 문제는 Windows 컨트롤에서 InvokeRequired를 검사하여 해결했지만, ComponenetOne 컨트롤에는 InvokeRequired 속성이 없습니다.

researchchanges에서 progresschanged 이벤트의 Controls 이미지 속성에 액세스하면 문제를 해결할 수 있다고 생각했습니다. 아래는 관련 코드입니다. doWork 및 progresschanged 이벤트는 모두 Worker 스레드에서 실행되지만 Cross-Threading 문제는 여전히 발생합니다. 누구든지 내가 뭘 잘못하고 있는지 보거나 그 문제를 해결할 수있는 또 다른 방법이 있습니까? 당신의 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(); 
    ... 
} 
+0

컨트롤의 컨테이너 (아마도 폼)의'InvokeRequired' 속성을 확인해 보았습니까? – ScottieMc

+0

나는 그것을 아무리 노력해도 아무도 도움을 줄 수없는 것처럼 주위를 생각하고있다. 하지만 답장을 해주신 ScottieMc에게 감사드립니다. –

답변

0

당신은 당신이 당신의 경우 BackgroundWorker를 시작하는 곳에서 코드를 게시하지만, didnt한다. 즉, 다른 스레드에서 메인 스레드로 작업을 시작한다는 의미입니다. 백그라운드 작업자는 SynchronizationContext을 캡처하여 progresschanged 및 runworkercompleted 이벤트에서 호출을 마샬링하기 시작합니다.

관련 문제