2010-07-19 4 views
1

윈도우 작업 양식 대화 상자가 있습니다. 여기서는 백그라운드 작업자 작업 내에서 더 긴 작업이 실행되고 있습니다 (비동기). 이 작업 중에 양식 (레이블, ...)의 일부 값을 변경하려고합니다. 그러나 backgroundworker가 양식에서 뭔가를 변경하려고하면 "크로스 스레드 작업이 유효하지 않습니다."오류가 발생합니다! 이 문제를 어떻게 해결할 수 있습니까?"크로스 스레드 작업이 유효하지 않습니다"라는 문제를 해결하는 방법은 무엇입니까?

+1

이 여기에 설명되어 있습니다 : http://msdn.microsoft.com/en- us/library/ms993020 –

+0

여기서 시작하는 것이 더 좋습니다 : http://msdn.microsoft.com/en-us/library/ms951089 시리즈 시작 부분! –

답변

3

를 호출 ReportProgress 작업자의 방법 및 현재 상태를 업데이트 할 ProgressChanged을 처리합니다.

2

호출이 필요한지 확인한 다음 BeginInvoke를 호출하십시오.

private void AdjustControls() 
     { 
      if (this.InvokeRequired) 
      { 
       this.Invoke(new MethodInvoker(this.AdjustControls)); 
      } 
      else 
      { 
       label1.Text = "Whatever"; 
      } 
     } 
+0

나는 이것을 시도했다. 그러나 그것은 효과가 없습니다. 좀 더 자세한 정보를 알려줄 수 있어요. 미리 감사드립니다! – uhu

+0

미안하지만, 조금 수정했습니다. AdjustControls가 매개 변수를 사용하는 경우 (예 : 이벤트 처리기 인 경우) MethodInvoker를 사용할 수 없으므로 대리자를 정의해야합니다. – Kurt

1

나는 내 자신의 경적을 여기에서 조금 이상하게 여기지만, 정확하게 목적을 위해 쓴 ThreadSafeControls 라이브러리에서 약간의 용도를 발견 할 수 있습니다.

1

컨트롤을 만들지 않은 스레드에서 컨트롤을 직접 변경할 수 없습니다. 위에 나와있는 것처럼 invoke 메서드를 사용하거나 BackgroundWorker ProgressChanged 이벤트를 사용할 수 있습니다. BackgroundWorker에 ProgressChanged 내부

myBackgroundWorker.ReportProgress(50); // Report that the background worker has got to 50% of completing its operations. 

코드를 사용 :

경우 BackgroundWorker DoWork 내에서 사용되는 코드

progressBar1.Value = e.ProgressPercentage; // Change a progressbar on the WinForm 
관련 문제