我有一些用于在.NET CF 2.0上启动线程的代码:
ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();
如果我在循环内调用此函数,那么项目的顺序会完全混乱。如何在t.Start()
之后引入等待,以便线程上的工作在代码继续之前完成? 使用BeginInvoke / EndInvoke是否比手动创建线程更好?
我有一些用于在.NET CF 2.0上启动线程的代码:
ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();
如果我在循环内调用此函数,那么项目的顺序会完全混乱。如何在t.Start()
之后引入等待,以便线程上的工作在代码继续之前完成? 使用BeginInvoke / EndInvoke是否比手动创建线程更好?
你需要对线程进行多少排序?如果你只需要在循环中启动的所有工作完成后代码才继续运行,但是你不关心循环内部的工作完成顺序,那么调用Join就是答案。为了更详细地解释Kevin Kenny的回答,你应该在循环外调用Join。这意味着你需要一个集合来保存你启动的线程的引用:
// Start all of the threads.
List<Thread> startedThreads = new List<Thread>();
foreach (...) {
Thread thread = new Thread(new ThreadStart(MyMethod));
thread.Start();
startedThreads.Add(thread);
}
// Wait for all of the threads to finish.
foreach (Thread thread in startedThreads) {
thread.Join();
}
等待线程完成的另一种方式是使用 AutoResetEvent
。
private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false);
private void Blah()
{
ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();
//... (any other things)
mWaitForThread.WaitOne();
}
private void MyMethod()
{
//... (execute any other action)
mWaitForThread.Set();
}
t.Join();