我有一些在 .NET CF 2.0 上启动线程的代码:

ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();

如果我在循环内调用它,则项目完全乱序。如何引入 wait after t.Start(), ,以便线程上的工作在代码继续之前完成?BeginInvoke/EndInvoke 是否是比手动创建线程更好的选择?

有帮助吗?

解决方案

您需要对线程施加多少顺序?如果您只需要在代码继续之前完成循环中开始的所有工作,但不关心循环中工作完成的顺序,那么调用 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();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top