"백그라운드 작업자로부터 GUI 업데이트"이지만 정확한 이름은 다음과 같습니다. "백그라운드 작업자로부터 GUI 업데이트 또는 다중 변수보고 (정수) 배경 직원 "백그라운드 작업자로부터 GUI 업데이트
제 상황을 설명해주십시오. 프로그램에서 나는 정보를 분석하는 배경 작업자가 있습니다.이 분석의 결과 - 양식 GUI 요소는 필요한 데이터로 채워 져야합니다. GUI에서 나는
- 2 datagridviews
- (1) 목록 상자를
- 5 라벨 업데이 트하려는
내가 알고있는 것처럼 - 내가 할 수있는 유일한 기본적으로 보고서 1 ReportProgress()
방법을 통해 int
값 배경 작업자입니다. ReportProgress()
을 통해 : -
그래서 질문은 어떻게 List<>
(string
, int
+ 다른 변수)를 통과 할 수 있습니까? 기본적으로 - 나는 정보를 가진 GUI를 업데이트하고 싶지만 "1 정수"는하지 않을 것입니다. 따라서 ReportProgress()
을 통해 여러 변수를 전달할 수 있어야합니다. 또는 Invoke
을 사용하여 BackgroundWorker 자체에서 업데이트 할 수 있습니다. GUI를 .. 개인적으로 나는 Invoke
접근 방식을 좋아하지 않는다 ... 당신의 의견은 어떻습니까?
여기에 (주석을 참조) 내 코드입니다 : ReportProgress
를 호출 할 때
private void button9_Click(object sender, EventArgs e) // start BW
{
bw.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
bw.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = true;
bw.RunWorkerAsync(10);
}
private void button10_Click(object sender, EventArgs e) // cancel BW
{
bw.CancelAsync();
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
int count = (int)e.Argument;
for (int i = 1; i <= count; i++)
{
if (bw.CancellationPending)
{
e.Cancel = true;
break;
}
List<List<string>> list_result = new List<List<string>>();
list_result = Proccess();
bw.ReportProgress(list_result.Count()); // right now I can only return a single INT
/////////// UPDATE GUI //////////////
// change datagridview 1 based on "list_result" values
// change datagridview 2
// change listbox
// change label 1
// change label ..
Thread.Sleep(20000);
}
MessageBox.Show("Complete!");
e.Result = sum;
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
prog_count++;
listBox1.Items.Add("Count: (" + prog_count.ToString() + "/20). Found: " + e.ProgressPercentage.ToString() + ".");
}
'Invoke'에 대해 마음에 들지 않는 점은 무엇입니까? –
ReportProgress에는 전달할 수있는 [UserState] (http://msdn.microsoft.com/en-us/library/a3zbdb1t (v = vs.110) .aspx) 개체도 있습니다. – LarsTech
@Savanna 그것은 내가 싫어 ... 나는 현재의 솔루션에 대한 대안/더 나은 관점을 찾고있다;) 어쩌면 BW에서 "새로운 스레드"로 이동하여 해결책이 될 것입니다 .. 개인적으로 나는 "If InvokeRequired, then ..."검사를해야하기 때문에 호출하는 것과 비슷하지만 다른 대안이 없다면이 하나를 고수해야한다. – Alex