C#多線程等待所有子線程結(jié)束的示例
在使用多線程過程中,可能會(huì)遇到在一些情況下必須等待子線程全部執(zhí)行結(jié)束后主線程才進(jìn)行下一步,
做法如下:
//在使用多線程過程中,可能會(huì)遇到在一些情況下必須等待子線程全部執(zhí)行結(jié)束后主線程才進(jìn)行下一步,做法如下
List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();//創(chuàng)建線程等待集合
for (int i = 0; i < 64; i++) //WaitHandles 的數(shù)目必須少于或等于 64 個(gè),所以最大線程數(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());//等待所有線程結(jié)束
Console.WriteLine("Thread Finished!");
private static void ThreadMethod(object obj)
{
MB m = (MB)obj;
Thread.Sleep(1000);//等待1秒,用于模擬系統(tǒng)在處理事情
m.mre.Set();//將事件設(shè)置為終止?fàn)顟B(tài)
Console.WriteLine("Thread execute:" + m.ID);
}
以上方法在處理時(shí)當(dāng)線程數(shù)超過64時(shí)報(bào)錯(cuò) WaitHandles 的數(shù)目必須少于或等于 64 個(gè),所以最大線程數(shù)為64
解決方法如下:
using (var countdown = new MutipleThreadResetEvent(list.Count))
{
for (int i = 0; i < list.Count; i++)
{
//開啟N個(gè)線程,傳遞MutipleThreadResetEvent對(duì)象給子線程
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>
/// 構(gòu)造函數(shù)
/// </summary>
/// <param name="total">需要等待執(zhí)行的線程總數(shù)</param>
public MutipleThreadResetEvent(int total)
{
this.total = total;
current = total;
done = new ManualResetEvent(false);
}
/// <summary>
/// 喚醒一個(gè)等待的線程
/// </summary>
public void SetOne()
{
// Interlocked 原子操作類 ,此處將計(jì)數(shù)器減1
if (Interlocked.Decrement(ref current) == 0)
{
//當(dāng)所以等待線程執(zhí)行完畢時(shí),喚醒等待的線程
done.Set();
}
}
/// <summary>
/// 等待所以線程執(zhí)行完畢
/// </summary>
public void WaitAll()
{
done.WaitOne();
}
/// <summary>
/// 釋放對(duì)象占用的空間
/// </summary>
public void Dispose()
{
((IDisposable)done).Dispose();
}
}
以上就是C#多線程等待所有子線程結(jié)束的示例的詳細(xì)內(nèi)容,更多關(guān)于c# 多線程等待子線程結(jié)束的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#使用winform簡(jiǎn)單導(dǎo)出Excel的方法
這篇文章主要介紹了C#使用winform簡(jiǎn)單導(dǎo)出Excel的方法,結(jié)合實(shí)例形式分析了WinForm操作Excel文件的寫入導(dǎo)出等相關(guān)技巧,需要的朋友可以參考下2016-06-06
VS2019屬性管理器沒有Microsoft.Cpp.x64.user的解決辦法
這篇文章主要介紹了VS2019屬性管理器沒有Microsoft.Cpp.x64.user的解決辦法,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換
這篇文章介紹了C#使用Enum.TryParse()實(shí)現(xiàn)枚舉安全轉(zhuǎn)換的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-08-08

