我有一些用于在 .NET CF 2.0 上启动线程的代码:
ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();
如果我在循环中调用它,则项目完全乱序。如何引入 wait after t.Start()
,以便在代码继续之前完成线程上的工作?BeginInvoke/EndInvoke 会比手动创建线程更好吗?
我有一些用于在 .NET CF 2.0 上启动线程的代码:
ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();
如果我在循环中调用它,则项目完全乱序。如何引入 wait after 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();
}
相反,如果你在循环内部调用 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();