【问题标题】:How to wait for thread complete before continuing?如何在继续之前等待线程完成?
【发布时间】:2010-09-05 15:12:27
【问题描述】:

我有一些用于在 .NET CF 2.0 上启动线程的代码:

ThreadStart tStart = new ThreadStart(MyMethod);
Thread t = new Thread(tStart);
t.Start();

如果我在循环中调用它,则项目完全乱序。如何在t.Start() 之后引入等待,以便线程上的工作在代码继续之前完成? BeginInvoke/EndInvoke 会比手动创建线程更好吗?

【问题讨论】:

    标签: c# multithreading compact-framework


    【解决方案1】:

    您需要对线程施加多少顺序?如果您只需要在代码继续之前完成循环中开始的所有工作,但您不关心循环中的工作完成的顺序,那么调用 Join 就是答案。要向Kevin Kenny's answer, 添加更多详细信息,您应该调用 Join outside 循环。这意味着您将需要一个集合来保存对您启动的线程的引用:

    // Start all of the threads.
    List<Thread> startedThreads = new List<Thread>();
    foreach (...) {
      Thread thread = new Thread(new ThreadStart(MyMethod));
      thread.Start();
      startedThreads.Add(thread);
    }
    
    // Wait for all of the threads to finish.
    foreach (Thread thread in startedThreads) {
      thread.Join();
    }
    

    相比之下,如果你在循环内部调用Join,结果基本上和完全不使用线程是一样的。循环体的每次迭代都会创建并启动一个线程,然后立即加入它并等待它完成。

    如果各个线程产生了一些结果(例如,在日志中写入消息),那么消息可能仍会出现乱序,因为线程之间没有协调。通过与 Monitor 协调,可以让线程按顺序输出结果。

    【讨论】:

      【解决方案2】:

      如果我没看错,您是在一堆线程上开始工作项目,但您担心线程正在无序完成,并且宁愿等到每个线程按照它们的顺序完成开始了?

      如果是这种情况,那么我不确定您为什么要为每个工作项创建一个线程。也许你可以扩展?

      如果您确实需要等待线程完成,您可以这样做:

      t.Join();
      

      【讨论】:

        【解决方案3】:

        另一种等待线程完成的方法是使用AutoResetEvent

        private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false);
        
        private void Blah()
        {
            ThreadStart tStart = new ThreadStart(MyMethod);
            Thread t = new Thread(tStart);
            t.Start();
        
            //... (any other things)
            mWaitForThread.WaitOne();
        }
        
        private void MyMethod()
        {
             //... (execute any other action)
             mWaitForThread.Set();
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          • 2020-02-24
          • 1970-01-01
          • 2019-03-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多