我有一个运行多个线程的小 c# 应用程序,但是我的主线程必须等待所有线程完成,然后它才能完成剩下的工作。现在的问题是我为每个线程使用 .join(),这似乎等待每个线程完成然后它转到下一个线程,这使得应用程序不是真正的多线程并且需要很长时间才能完成。
所以我想知道是否有任何方法可以解决这个问题,或者只是一种检查是否没有更多线程处于活动状态的方法。
谢谢
如果你挂在 Thread 对象上,你可以使用Thread.IsAlive
.
或者,您可能需要考虑在完成后从您的线程中触发一个事件。
Thread.Join()
并不意味着您的应用程序不是多线程的 - 它告诉当前线程等待另一个线程完成,这正是您想要的。
执行以下操作:
List<Thread> threads = new List<Thread>();
/** create each thread, Start() it, and add it to the list **/
foreach (Thread thread in threads)
{
thread.Join()
}
将继续运行其他线程,除了当前/主线程(它将等到其他线程完成)。
只需使用Thread.Join()
Ye,正如 Cuong Le 所说,使用任务并行库会非常有效。但是,您可以创建一个线程列表,然后检查它们是否还活着。
var threadsList = new List<Thread>();
threadsList.Add(myThread); // to add
bool areDone = true;
foreach (Thread t in threadsList) {
if (t.IsAlive)
{
areDone = false;
break;
}
}
if (areDone)
{
// Everything is finished :O
}
同时运行多个,但想等待它们全部完成,这是使用 Parallel.ForEach 执行相同操作的一种方法:
var arrStr = new string[] {"1st", "2nd", "3rd"};
Parallel.ForEach<string>(arrStr, str =>
{
DoSomething(str); // your custom method you wanted to use
Debug.Print("Finished task for: " + str);
});
Debug.Print("All tasks finished");
如果您希望所有任务都通过相同的方法运行,那是最简单和最有效的我想如果在 C# 4.0 中它可以运行