0

我在主线程中有一个listoddata和一个线程列表。我将列表的每个元素数据传递给相应的线程。希望主线程等待所有线程都被执行。

for (int i = 0; i < listOfThread.Count; i++)
            {
                listOfThread[i].Join();

            }
// code after all of thread completes its work
//code block2

但是在这个循环的第一次迭代之后,主线程将不会被执行。如果任何线程 0 完成。代码块将被执行。我不想要。

4

2 回答 2

3

这是处理多个线程的一种完全有效的方法join。如果您等待所有线程,即使是按顺序等待,也可以。它不必等待已经完成的线程。如果线程仍在运行,它将等待该线程完成。

于 2009-05-17T15:22:43.230 回答
1

Sahil,您通过确保调用所有线程上的连接而不必等待每个线程执行来试图实现什么?如果它是为了性能,它不会有太大帮助,因为无论如何,即使您在所有线程上调用 thread.join,它也必须等待每个线程完成才能继续前进。

无论如何,如果您必须这样做,那么这就是我要说的:

没有直接的方法可以在一个 stmt 中等待所有线程。相反,经过一些研发后,我想出了一些间接的方法。您可以直接在 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);

    }
} 
于 2009-05-17T15:20:03.033 回答