윈도우 폼에서 버튼을 클릭 할 때 두 개의 다른 스레드에서 실행해야하는 두 개의 독립적 인 함수가 있습니다.여러 독립 스레드가 실행 된 경우 UI에서 레이블 텍스트를 업데이트하는 방법 Join의 사용법은 무엇입니까
두 스레드가 완전히 실행되면 Form의 상태가 "Status Updated"로 설정되어야합니다.
어떻게하면됩니까?
EDIT 다음 코드를 실행하려고하는데 문제를 파악할 수 없습니다. 내가 Join을 호출하면. 내 스레드가 무한대로 고정됩니다.
Thread t1, t2;
int cT1;
int ctT2;
private void btnStart_Click(object sender, EventArgs e)
{
t1 = new Thread(CountN);
t2 = new Thread(CountT2);
t1.Start(int.Parse(txtT1.Text)); //3
t2.Start(int.Parse(txtT2.Text)); //4
t2.Join();
label1.Text = (cT1 + ctT2).ToString();
}
private void CountN(object sender)
{
for (int i = 0; i < (int)sender; i++)
{
cT1++;
if (lblMsg.InvokeRequired)
lblMsg.Invoke(new Action<int>((x) => lblMsg.Text = x.ToString()), cT1);
}
}
private void CountT2(object sender)
{
for (int i = 0; i < (int)sender; i++)
{
ctT2++;
if (lblMsg2.InvokeRequired)
lblMsg2.Invoke(new Action<int>((x) => lblMsg2.Text = x.ToString()), ctT2);
}
}
't2.Join();을 사용하여 Join은 호출 스레드를 차단하지만이 행은 의미합니까? 이 라인이 쓰여진 쓰레드는 t2 쓰레드가 완료되지 않으면 차단 될 것입니다. 또한 "Delegate의 실행을 UI에 마샬링 할 Control.Invoke"를 설명하십시오. –
예,'Join'은't2'가 끝날 때까지 호출 스레드를 차단합니다. '통제.Invoke'는 작업자 스레드에서 대리자를 실행하지 않습니다. 대신'Control' 레퍼런스 (UI 스레드)를 호스팅하는 스레드에서이를 실행합니다. 이 작업을 수행하기 위해 UI 스레드의 메시지 큐에 메시지를 게시하는 마샬링 작업을 사용합니다. –