c# - 确定所有线程何时完成 C#

标签 c# multithreading thread-safety

作为 C# 的初学者,我对线程非常陌生。我有一个程序将在 Windows 应用程序中触发多个线程。我的目标是为列表中的每个项目启动一个新线程。此列表中的项目是网络上的工作站名称。创建的每个线程都将在每台机器上进行修复,当线程完成后,它将写入发现的任何错误等的日志文件。但我希望能够确定的是所有线程何时完成。因此,如果我有 100 台机器、100 个线程,我如何确定所有机器何时关闭?

下面是我的方法:-

private void repairClientsToolStripMenuItem_Click(object sender, EventArgs e)
{
    if (machineList.Count() != 0)
    {
        foreach (string ws in machineList)
        {
            new Thread(new ParameterizedThreadStart(fixClient), stack).Start(ws);
        }
    }
    else
    {
         MessageBox.Show("Please import data before attempting this procedure");
    }
}

最佳答案

这样做的方法是保留对所有线程的引用,然后是 Join在他们。这基本上意味着当前线程将阻塞,直到加入的线程完成。

将循环更改为:

foreach (string ws in machineList)
{
   var thread = new Thread(new ParameterizedThreadStart(fixClient), stack);
   _machineThreads.Add(thread)
   thread.Start();
}

(其中 _machineThreads 是 System.Thread 的列表)

然后您可以阻塞,直到所有内容都完成,例如:

private void WaitUntilAllThreadsComplete()
{
   foreach (Thread machineThread in _machineThreads)
   {
      machineThread.Join();
   } 
}

但是 - 您几乎肯定不希望针对您描述的场景执行此操作:

  • 您不应该创建大量线程 - 显式创建数百个线程不是一个好主意
  • 您应该更喜欢其他方法 - 尝试查看 Parallel.ForEachSystem.Threading.Task .如今,.Net 在处理线程和异步任务时为您提供了很多帮助 - 我真的建议您仔细阅读它,而不是尝试使用显式线程“自己动手”。
  • 这看起来像一个点击处理程序。它是 ASP.NET Web 表单还是桌面应用程序?如果是前者,我当然不会建议生成大量线程来根据请求执行后台任务。无论哪种情况,您真的希望您的网页或 GUI 在等待线程完成时阻塞吗?

关于c# - 确定所有线程何时完成 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294469/

相关文章:

c# - 在 Windows Phone 7 中通过 http 流式传输使用 .pls 文件播放广播

c# - 通过结构指针将结构数组从 C# 传递到 C

c++ - 生产者/消费者,如何确保在关闭所有消费者之前耗尽线程安全队列?

java - 用于获取和设置的线程安全数据结构

java - 异常和线程安全沙箱

c# - 如何通过使用 C# 单击按钮来中止 while 循环

C# 复杂属性 setter 选项

c - 在 C 中使用信号量进行多线程

.net - .NET 中关于阻塞调用的线程调度

c# - .ToList() 线程安全