1

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

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

谢谢

4

5 回答 5

1

如果你挂在 Thread 对象上,你可以使用Thread.IsAlive.

或者,您可能需要考虑在完成后从您的线程中触发一个事件。

于 2013-06-01T03:34:06.337 回答
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()

于 2013-06-01T04:19:53.107 回答
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
}
于 2013-06-01T03:36:20.783 回答
0

尝试使用BackgroundWorker

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

这是先前回答的问题的一个示例

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

于 2013-06-01T04:29:42.297 回答
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 中它可以运行

于 2013-06-01T03:52:52.893 回答