5 가지 옵션을 사용할 수 있습니다.
1. 스레드. 조인
미치의 대답과 마찬가지로. 그러나 이것은 UI 스레드를 차단하지만 타임 아웃이 내장되어 있습니다.
2. 사용 WaitHandle
ManualResetEvent
이다 WaitHandle
제안 jrista으로는.
WaitHandle.WaitAll()
MTA 스레드가 필요하기 때문에 여러 스레드를 대기하려는 경우 기본적으로 작동하지 않습니다. Main()
방법을 표시 하여이 문제를 해결할 수 MTAThread
있지만 메시지 펌프를 차단하므로 읽은 내용에서 권장하지 않습니다.
3. 이벤트를 시작
참조 존 소총으로이 페이지 이벤트 및 멀티 스레딩에 대한을,이 이벤트가 사이 unsubcribed이 될 수 있다는 가능성 if
과 EventName(this,EventArgs.Empty)
- 그 전에 나에게 일어난.
(다행 스럽게도이 컴파일은 시도하지 않았습니다)
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread1 = new Thread(worker.Run);
thread1.Start();
_count = 1;
}
void HandleThreadDone(object sender, EventArgs e)
{
// You should get the idea this is just an example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
worker.ThreadDone += HandleThreadDone;
Thread thread2 = new Thread(worker.Run);
thread2.Start();
_count++;
}
}
class ThreadWorker
{
public event EventHandler ThreadDone;
public void Run()
{
// Do a task
if (ThreadDone != null)
ThreadDone(this, EventArgs.Empty);
}
}
}
4. 대리인 사용
public class Form1 : Form
{
int _count;
void ButtonClick(object sender, EventArgs e)
{
ThreadWorker worker = new ThreadWorker();
Thread thread1 = new Thread(worker.Run);
thread1.Start(HandleThreadDone);
_count = 1;
}
void HandleThreadDone()
{
// As before - just a simple example
if (_count == 1)
{
ThreadWorker worker = new ThreadWorker();
Thread thread2 = new Thread(worker.Run);
thread2.Start(HandleThreadDone);
_count++;
}
}
class ThreadWorker
{
// Switch to your favourite Action<T> or Func<T>
public void Run(object state)
{
// Do a task
Action completeAction = (Action)state;
completeAction.Invoke();
}
}
}
_count 메소드를 사용하는 경우 다음을 사용하여 늘리는 것이 안전 할 수 있습니다.
Interlocked.Increment(ref _count)
스레드 알림을 위해 델리게이트와 이벤트를 사용하는 것의 차이점을 알고 싶습니다. 알고있는 유일한 차이점은 이벤트가 동 기적으로 호출된다는 것입니다.
5. 대신 비동기 적으로 수행
에 대한 대답 이 질문은 이 방법으로 옵션의 아주 명확한 설명이 있습니다.
잘못된 스레드의 델리게이트 / 이벤트
이벤트 / 델리게이트 방식은 이벤트 핸들러 메소드 가 기본 UI 스레드가 아닌 thread1 / thread2에 있음 을 의미 하므로 HandleThreadDone 메소드의 맨 위에서 오른쪽으로 다시 전환해야합니다.
// Delegate example
if (InvokeRequired)
{
Invoke(new Action(HandleThreadDone));
return;
}