我有一个listoddata和主线程中的线程列表。我正在将列表的每个元素数据传递给相应的thread.want到主线程等待直到所有线程都被执行。
for (int i = 0; i < listOfThread.Count; i++)
{
listOfThread[i].Join();
}
// code after all of thread completes its work
//code block2
但是在这个循环的第一次迭代之后,主线程将不会被执行。如果任何线程0被完成。将执行代码块。我不想要的。
答案 0 :(得分:3)
这是在多个线程上join
完全有效的方法。如果你等待所有的线程,即使顺序,也没关系。它不必等待已经完成的线程。如果一个线程仍在运行,它将等待该线程完成。
答案 1 :(得分:1)
Sahil,你想通过确保调用所有线程的连接而不必等待每个线程执行来实现什么?如果它的性能,它将没有多大帮助,因为无论如何即使你在所有线程上调用thread.join,它也必须等待每个线程完成才能继续前进。
无论如何,如果你必须,那么这就是我要说的:
没有直接的方法可以等待一个stmt中的所有线程。相反,在一些R&amp; D之后,我提出了一些间接方法。您可以直接在ParameterizedThreadDelegate上执行BeginInvoke,而不是初始化线程并将ParameterizedThreadDelegate传递给它。然后你可以使用WaitHandle.WaitAll等待所有代表完成执行,然后再继续。
以下是代码:
class Program
{
static void Main(string[] args)
{
List<ParameterizedThreadStart> listDelegates = new List<ParameterizedThreadStart>();
listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Print));
listDelegates.Add(new ParameterizedThreadStart(DelegateEg.Display));
List<WaitHandle> listWaitHandles = new List<WaitHandle>();
foreach (ParameterizedThreadStart t in listDelegates)
listWaitHandles.Add(t.BeginInvoke("In Thread", null, null).AsyncWaitHandle);
WaitHandle.WaitAll(listWaitHandles.ToArray());
Console.WriteLine("All threads executed");
Console.Read();
}
}
public class DelegateEg
{
public static void Print(object obj)
{
Console.WriteLine("In print");
Console.WriteLine(obj);
}
public static void Display(object obj)
{
Console.WriteLine("In Display");
Console.WriteLine(obj);
}
}