作为 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.ForEach和 System.Threading.Task .如今,.Net 在处理线程和异步任务时为您提供了很多帮助 - 我真的建议您仔细阅读它,而不是尝试使用显式线程“自己动手”。
- 这看起来像一个点击处理程序。它是 ASP.NET Web 表单还是桌面应用程序?如果是前者,我当然不会建议生成大量线程来根据请求执行后台任务。无论哪种情况,您真的希望您的网页或 GUI 在等待线程完成时阻塞吗?
关于c# - 确定所有线程何时完成 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294469/