我的线程代码的执行时间不会受到具有Join的线程的影响

时间:2010-07-21 07:36:00

标签: c# .net multithreading

我正在我的一个应用程序中创建三个线程。我的要求是创建这三个线程并启动它们的方法不应该返回,除非所有这三个线程都被执行。

我尝试在所有三个线程上使用Join。但是,我观察到当我使用Join时,我的方法的总执行时间是所有三个线程的执行时间的总和。换句话说,它们是按顺序执行的。

我尝试使用ThreadState,但是从MSDN和stackoverflow实现,ThreadState属性应仅用于调试目的,而不是用于实际编码。

实现这一目标的最佳方法是什么,并保持执行并行。

任何想法都将不胜感激。提前致谢

4 个答案:

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

您可以与代理人异步执行此操作。

在回调处理程序中实现一些逻辑,当其中一个线程完成时设置一个标志。

在您的调度程序中,您只需等待为所有线程设置此标志然后返回。

但诚实地说,如果你需要这样做,你可能会从错误的角度解决问题。

正如其他人所问,您可以发布一些代码,或解释您希望实现的目标吗?