C#多線程等待所有子線程結束的示例
更新時間:2020年12月04日 09:58:24 作者:Bruce-
這篇文章主要介紹了C#多線程等待所有子線程結束的示例,幫助大家更好的理解和學習c#編程語言,感興趣的朋友可以了解下
在使用多線程過程中,可能會遇到在一些情況下必須等待子線程全部執(zhí)行結束后主線程才進行下一步,
做法如下:
//在使用多線程過程中,可能會遇到在一些情況下必須等待子線程全部執(zhí)行結束后主線程才進行下一步,做法如下 List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();//創(chuàng)建線程等待集合 for (int i = 0; i < 64; i++) //WaitHandles 的數(shù)目必須少于或等于 64 個,所以最大線程數(shù)為64 { MB m = new MB();//自定義類,用于傳參 m.mre= new ManualResetEvent(false); m.ID = i; manualEvents.Add(m.mre); ThreadPool.QueueUserWorkItem(ThreadMethod, m); } WaitHandle.WaitAll(manualEvents.ToArray());//等待所有線程結束 Console.WriteLine("Thread Finished!");
private static void ThreadMethod(object obj) { MB m = (MB)obj; Thread.Sleep(1000);//等待1秒,用于模擬系統(tǒng)在處理事情 m.mre.Set();//將事件設置為終止狀態(tài) Console.WriteLine("Thread execute:" + m.ID); }
以上方法在處理時當線程數(shù)超過64時報錯 WaitHandles 的數(shù)目必須少于或等于 64 個,所以最大線程數(shù)為64
解決方法如下:
using (var countdown = new MutipleThreadResetEvent(list.Count)) { for (int i = 0; i < list.Count; i++) { //開啟N個線程,傳遞MutipleThreadResetEvent對象給子線程 Param p = new Param(); p.countdown = countdown; p.Path = pa[i]; ThreadPool.QueueUserWorkItem(MyHttpRequest, p); } //等待所有線程執(zhí)行完畢 countdown.WaitAll(); }
public class MutipleThreadResetEvent: IDisposable { private readonly ManualResetEvent done; private readonly int total; private long current; /// <summary> /// 構造函數(shù) /// </summary> /// <param name="total">需要等待執(zhí)行的線程總數(shù)</param> public MutipleThreadResetEvent(int total) { this.total = total; current = total; done = new ManualResetEvent(false); } /// <summary> /// 喚醒一個等待的線程 /// </summary> public void SetOne() { // Interlocked 原子操作類 ,此處將計數(shù)器減1 if (Interlocked.Decrement(ref current) == 0) { //當所以等待線程執(zhí)行完畢時,喚醒等待的線程 done.Set(); } } /// <summary> /// 等待所以線程執(zhí)行完畢 /// </summary> public void WaitAll() { done.WaitOne(); } /// <summary> /// 釋放對象占用的空間 /// </summary> public void Dispose() { ((IDisposable)done).Dispose(); } }
以上就是C#多線程等待所有子線程結束的示例的詳細內容,更多關于c# 多線程等待子線程結束的資料請關注腳本之家其它相關文章!
相關文章
通過?C#/VB.NET?代碼將?Excel?工作表拆分為單獨的文件
這篇文章主要介紹了通過C#/VB.NET代碼將Excel工作表拆分為單獨的文件,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09C#中實現(xiàn)PriorityQueue優(yōu)先級隊列的代碼
這篇文章主要介紹了C#中PriorityQueue優(yōu)先級隊列的實現(xiàn),構造初始化這部分主要介紹關鍵的字段和方法,比較器的初始化以及堆的初始化,需要的朋友可以參考下2021-12-12C#ComboBox控件“設置 DataSource 屬性后無法修改項集合”的解決方法
這篇文章主要介紹了C#ComboBox控件“設置 DataSource 屬性后無法修改項集合”的解決方法 ,需要的朋友可以參考下2019-04-04