我们如何检查除主线程之外是否没有更多活动线程?

时间:2013-06-01 03:23:47

标签: c# .net

我有一个带有多个线程运行的小型c#app,但我的主线程必须等待所有线程完成然后它可以完成剩下的工作。 问题现在是我使用.join()为每个线程,这似乎等待每个线程完成然后它转到下一个线程,这使得应用程序不是真正的多线程,并需要很长时间才能完成。

所以我想知道是否有任何方法可以解决这个问题,或者只是一种方法来检查是否有更多的线程处于活动状态。

感谢

5 个答案:

答案 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)

尝试使用BackgroundWorker

它在工作完成后在主线程(RunWorkerCompleted)中引发一个事件

以下是先前回答的问题中的一个样本

https://stackoverflow.com/a/5551376/148697