【问题标题】:asp.net :to call join method on more than one thread objects?asp.net:在多个线程对象上调用连接方法?
【发布时间】:2010-10-26 20:35:52
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: .net multithreading join main


    【解决方案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);
    
        }
    } 
    

    【讨论】:

    • 谢谢,但我认为我很愚蠢。paul Fisher 是对的。它已经运行良好了。
    • 是的......我暗示同样的事情......无论如何这对我来说是很好的研发:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 2016-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多