我正在我的一个应用程序中创建三个线程。我的要求是创建这三个线程并启动它们的方法不应该返回,除非所有这三个线程都被执行。
我尝试在所有三个线程上使用Join。但是,我观察到当我使用Join时,我的方法的总执行时间是所有三个线程的执行时间的总和。换句话说,它们是按顺序执行的。
我尝试使用ThreadState,但是从MSDN和stackoverflow实现,ThreadState属性应仅用于调试目的,而不是用于实际编码。
实现这一目标的最佳方法是什么,并保持执行并行。
任何想法都将不胜感激。提前致谢
答案 0 :(得分:5)
然而,我观察到我使用的时候 加入我的总执行时间 method是执行时间的总和 所有三个线程。换一种说法 他们正在按顺序执行。
这表明你没有正确启动线程,或者它们正在执行阻止它们并行执行的锁定。依次在每个线程上调用Join
是一种等待每个线程完成的简单有效的方法。
我可以想象的一个错误是,如果您启动每个线程并在启动后立即调用Join
而不是等到您已经开始所有线程。例如:
// Incorrect code
for (int i = 0; i < 3; i++)
{
Thread t = new Thread(Task);
t.Start();
t.Join();
}
相反,您应该启动所有三个线程然后加入所有线程:
List<Thread> threads = new List<Thread>();
for (int i = 0; i < 3; i++)
{
Thread t = new Thread(Task);
t.Start();
threads.Add(t);
}
foreach (Thread t in threads)
{
t.Join();
}
这能解释您的问题吗?如果没有,请发布显示您正在做的事情的代码。
答案 1 :(得分:1)
我怀疑你的问题与你创建和运行线程的方式有关,因为如果正确使用Thread.Join将不会导致你的线程串行运行(一个接一个)。它会做什么让你等到最长的运行线程完成。
您可以发布一些代码示例吗?
答案 2 :(得分:1)
你可以试试这个:
http://msdn.microsoft.com/en-us/library/system.threading.waithandle.aspx
我认为这是处理此问题的最佳方法和推荐方法。
答案 3 :(得分:0)
您可以与代理人异步执行此操作。
在回调处理程序中实现一些逻辑,当其中一个线程完成时设置一个标志。
在您的调度程序中,您只需等待为所有线程设置此标志然后返回。
但诚实地说,如果你需要这样做,你可能会从错误的角度解决问题。
正如其他人所问,您可以发布一些代码,或解释您希望实现的目标吗?