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

Der*_*rek 8 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*ine 11

这样做的方法是保持对所有线程的引用,然后加入它们.这基本上意味着当前线程将阻塞,直到连接的线程完成.

将你的循环改为:

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

(其中_machineThreads是列表System.Thread)

然后你可以阻止所有的完成,例如:

private void WaitUntilAllThreadsComplete()
{
   foreach (Thread machineThread in _machineThreads)
   {
      machineThread.Join();
   } 
}
Run Code Online (Sandbox Code Playgroud)

但是 - 你几乎肯定不想为你描述的场景做这个:

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