2012-06-26 7 views
2

내 Do_Work 이벤트 내 Winform에서 배경 작업자 스레드를 사용하고 있습니다. 계산할 때 필요한 것은 무엇인지, 동시에 메인/UI 스레드에서? 어떻게 이것을 달성 하는가? 당신의 Do_Work 방법 내부백그라운드에서 실행중인 UI로 컨트롤을 업데이트하십시오. Winforms의 스레드

내가 Do_Work 이벤트에서 내 레이블을 업데이트 할 ...

+1

하면 ReportProgress 방법을 참조로 Do_Work 방법의 간단한 작업을 쓰기입니다해야 할 일 및 ProgressChanged 이벤트. 문자열을 사용자 데이터로 전달할 수 있습니다. –

답변

1

, 당신은 그것의 UI 스레드에서 대리자를 실행하는 개체의 Invoke() 방법을 사용할 수 있습니다 예 :

this.Invoke(new Action<string>(UpdateLabel), newValue); 

... 다음 클래스에 다음과 같은 방법을 추가해야합니다 :

private void UpdateLabel(string value) 
{ 
    this.lblMyLabel.Text = value; 
} 
0

을 나는 희망이 도움 :

int x = 0; 
    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 

     label1.Text = x.ToString(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     x++; 
     //you can put any value 
     backgroundWorker1.ReportProgress(0); 
    } 

    private void button6_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 
+0

이 코드는이 코드가 "backgroundWorker1.ReportProgress (0); 예외를 제공하더라도 실제로 도움이되지 않습니다." – user1444231

+0

WorkerReportsProgress를 true로 설정 했습니까? 네가 그랬다면 예외 메시지를 내게 주렴. –

5

WinForms (WPF도 마찬가지) UI 컨트롤은 UI 스레드에서만 업데이트 할 수 있습니다. 그것은 (UI)가 다른 스레드에서 (mainThread)이기 때문에 우선은 많은으로 갈 수

public void UpdateLabel(String text){ 
    if (label.InvokeRequired) 
    { 
     label.Invoke(new Action<string>(UpdateLabel), text); 
     return; 
    }  
    label.Text = text; 
} 
0

당신은 사용자 인터페이스 (라벨) 업데이트 중에 크로스 스레드 예외의 문제에 직면하고있다 : 당신은 당신의 라벨이 방법을 업데이트해야합니다 TPL, ThreadPool이, 저쩌구하지만 간단한 방법 등의 옵션은 당신이 원하는 것은

개인 무효 backgroundWorker1_DoWork (개체를 보낸 사람, DoWorkEventArgs 전자)

{ 
    x++; 
    //you can put any value 
    Action = act =()=> 
      { 
       label.Text = Convert.ToString(x); 
      }; 
    if (label.InvokeRequired) 
     label.BeginInvoke(act); 
    else 
      label.Invoke(act); 
    backgroundWorker1.ReportProgress(0); 
} 
관련 문제