내 Do_Work 이벤트 내 Winform에서 배경 작업자 스레드를 사용하고 있습니다. 계산할 때 필요한 것은 무엇인지, 동시에 메인/UI 스레드에서? 어떻게 이것을 달성 하는가? 당신의 Do_Work
방법 내부백그라운드에서 실행중인 UI로 컨트롤을 업데이트하십시오. Winforms의 스레드
내가 Do_Work 이벤트에서 내 레이블을 업데이트 할 ...
내 Do_Work 이벤트 내 Winform에서 배경 작업자 스레드를 사용하고 있습니다. 계산할 때 필요한 것은 무엇인지, 동시에 메인/UI 스레드에서? 어떻게 이것을 달성 하는가? 당신의 Do_Work
방법 내부백그라운드에서 실행중인 UI로 컨트롤을 업데이트하십시오. Winforms의 스레드
내가 Do_Work 이벤트에서 내 레이블을 업데이트 할 ...
, 당신은 그것의 UI 스레드에서 대리자를 실행하는 개체의 Invoke()
방법을 사용할 수 있습니다 예 :
this.Invoke(new Action<string>(UpdateLabel), newValue);
... 다음 클래스에 다음과 같은 방법을 추가해야합니다 :
private void UpdateLabel(string value)
{
this.lblMyLabel.Text = value;
}
을 나는 희망이 도움 :
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();
}
이 코드는이 코드가 "backgroundWorker1.ReportProgress (0); 예외를 제공하더라도 실제로 도움이되지 않습니다." – user1444231
WorkerReportsProgress를 true로 설정 했습니까? 네가 그랬다면 예외 메시지를 내게 주렴. –
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;
}
당신은 사용자 인터페이스 (라벨) 업데이트 중에 크로스 스레드 예외의 문제에 직면하고있다 : 당신은 당신의 라벨이 방법을 업데이트해야합니다 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);
}
하면 ReportProgress 방법을 참조로 Do_Work 방법의 간단한 작업을 쓰기입니다해야 할 일 및 ProgressChanged 이벤트. 문자열을 사용자 데이터로 전달할 수 있습니다. –