c# - 如何在继续之前等待线程完成?

标签 c# multithreading compact-framework

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

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

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

最佳答案

您需要对线程施加多少顺序?如果您只需要在代码继续之前完成循环中开始的所有工作,但您不关心循环中工作完成的顺序,那么调用 Join 就是答案。向 Kevin Kenny's answer, 添加更多详细信息你应该调用 Join outside 循环。这意味着您将需要一个集合来保存对您启动的线程的引用:

// 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,结果基本上与根本不使用线程相同。循环体的每次迭代都会创建并启动一个线程,然后立即加入它并等待它完成。

如果各个线程产生一些结果(例如,在日志中写入一条消息),那么这些消息可能仍会出现乱序,因为线程之间没有协调。通过与 Monitor 协调,可以让线程按顺序输出它们的结果。

关于c# - 如何在继续之前等待线程完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890/

相关文章:

c# - 测试异步/回调 Visual Studio

c# - C#中的进度条和backgroundworker

visual-studio-2008 - JSON.NET Visual Studio 2008 和 .NET 3.5 Compact Framework

.net - 如何处理其他线程上的错误?

c# - 希望能够在其外部单击时关闭模态弹出窗口

c# - 将“/”更改为“\” [C#]

c# - 使用itextsharp将图像设置为pdf中的水印的问题

multithreading - 从另一个线程原子地取消 asio 异步计时器

python - 有序关闭Python环境

c# - 如何在数据网格控件的每一行的开头添加复选框控件?