簡體   English   中英

等待兩個線程完成

[英]Wait for two threads to finish

如果你有一個主線程啟動另外兩個線程。 使主線程等待另外兩個線程的最簡潔方法是什么?

我可以使用bgndworker和sleep spinner來檢查bgnd worker的IsBusy,但我認為有更好的方法。

編輯更多要求:

  • 主線程還有其他一些工作要做(例如GUI)。
  • 兩個衍生線程應該能夠報告異常並返回結果值

使用Thread.Join()的快速示例;

        Thread t1 = new Thread(new ThreadStart(delegate()
        {
            System.Threading.Thread.Sleep(2000);
        }));

        Thread t2 = new Thread(new ThreadStart(delegate()
        {
            System.Threading.Thread.Sleep(4000);
        }));

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();

使用等待句柄編輯另外3個示例:

            ManualResetEvent[] waitHandles = new ManualResetEvent[]{
            new ManualResetEvent(false),
            new ManualResetEvent(false)
        };

        Thread t1 = new Thread(new ParameterizedThreadStart(delegate(object state)
        {
            ManualResetEvent handle = (ManualResetEvent)state;
            System.Threading.Thread.Sleep(2000);
            handle.Set();
        }));

        Thread t2 = new Thread(new ParameterizedThreadStart(delegate(object state)
        {
            ManualResetEvent handle = (ManualResetEvent)state;
            System.Threading.Thread.Sleep(4000);
            handle.Set();
        }));

        t1.Start(waitHandles[0]);
        t2.Start(waitHandles[1]);

        WaitHandle.WaitAll(waitHandles);

        Console.WriteLine("Finished");

請參閱此主題的答案。 我喜歡這個選項 ;-p

Forker p = new Forker();
p.Fork(delegate { DoSomeWork(); });
p.Fork(delegate { DoSomeOtherWork(); });
p.Join();

重新返回值/報告異常 - 只需讓每個分支在邏輯結束時作為回調...(您可以使用捕獲的變量將狀態傳遞到兩個分支,包括共享記錄器等)。

thread1.Join();
thread2.Join();

除了其他答案之外......“啟動兩個線程並等待兩個完成”的另一種選擇是“啟動一個線程並自己完成一個工作,然后等待另一個線程完成”。

當然,如果你想要開始兩個工作,在主線程上再做一些工作, 然后等待另外兩個線程完成,這不能很好地工作。

編輯:如果主線程是一個UI線程,你不應該阻塞其他線程完成 - 你應該(IMO)讓他們在完成后回調主線程。 這樣,您在執行時仍會擁有響應式用戶界面。

您不能等待完成並且可以使用GUI。 最好的方法是生成線程並使用事件與GUI進行通信。 請記住,在事件處理程序中,您無法修改控件。 而是直接使用Invoke方法。

WaitHandle.WaitAny是你的朋友。 它允許您等待多個線程或其他類型的對象發出信號。

http://msdn.microsoft.com/en-us/library/tdykks7z.aspx

編輯:

實際上,WaitHandle.WaitAll就是你想要的,而不是WaitAny。

http://msdn.microsoft.com/en-us/library/system.threading.waithandle.waitall.aspx

編輯:

一些提到的Join方法是可以的,但一個缺點是它不是完全原子操作。 但是,這可能對您很重要,也可能不重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM