我有一个带有多个线程运行的小型c#app,但我的主线程必须等待所有线程完成然后它可以完成剩下的工作。 问题现在是我使用.join()为每个线程,这似乎等待每个线程完成然后它转到下一个线程,这使得应用程序不是真正的多线程,并需要很长时间才能完成。
所以我想知道是否有任何方法可以解决这个问题,或者只是一种方法来检查是否有更多的线程处于活动状态。
感谢
答案 0 :(得分:1)
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()
答案 1 :(得分:0)
如果您正在使用Thread对象,则可以使用Thread.IsAlive
。
或者,您可能需要考虑在完成后从您的线程中触发事件。
答案 2 :(得分:0)
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
}
答案 3 :(得分:0)
同时运行多个但希望等待所有这些完成,这是使用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中它可以去。
答案 4 :(得分:0)