C#中EventWaitHandle的用法小結(jié)
EventWaitHandle 是 C# 中用于線程間同步的一個(gè)類,它提供了對共享資源的訪問控制,以及線程間的同步機(jī)制。EventWaitHandle 類位于 System.Threading 命名空間下,主要用于實(shí)現(xiàn)互斥訪問、信號量控制等場景。
創(chuàng)建 EventWaitHandle
創(chuàng)建一個(gè) EventWaitHandle 需要指定兩個(gè)參數(shù):初始狀態(tài)和重置模式。
using System.Threading; // 創(chuàng)建一個(gè)初始狀態(tài)為未設(shè)置的自動(dòng)重置事件 EventWaitHandle autoEvent = new EventWaitHandle(false, EventResetMode.AutoReset); // 創(chuàng)建一個(gè)初始狀態(tài)為設(shè)置的自動(dòng)重置事件 EventWaitHandle manualEvent = new EventWaitHandle(true, EventResetMode.ManualReset);
使用 EventWaitHandle
設(shè)置和重置事件
Set(): 當(dāng)事件被設(shè)置時(shí),所有等待該事件的線程都將被釋放。Reset(): 將事件的狀態(tài)重置為未設(shè)置狀態(tài)。
對于 AutoReset 類型的 EventWaitHandle,一旦設(shè)置狀態(tài)被觸發(fā)后會(huì)立即重置回未設(shè)置狀態(tài)。而 ManualReset 類型則需要顯式地調(diào)用 Reset() 方法來重置事件。
manualEvent.Reset();
將manualEvent的狀態(tài)重置為未設(shè)置(即信號量為假)。這通常意味著任何正在等待該事件的線程將繼續(xù)等待。
對于ManualReset類型的EventWaitHandle,這是必須的;否則,即使已經(jīng)調(diào)用了Set()方法,等待中的線程也不會(huì)被喚醒。
manualEvent.Set();
將manualEvent的狀態(tài)設(shè)置為已設(shè)置(即信號量為真)。如果有任何線程正在等待這個(gè)事件,那么它們將不再等待并繼續(xù)執(zhí)行。
對于ManualReset類型的EventWaitHandle,狀態(tài)需要手動(dòng)重置才能再次等待。
manualEvent.Set(); // 手動(dòng)設(shè)置事件 manualEvent.Reset(); // 手動(dòng)重置事件
等待事件
WaitOne(): 使調(diào)用線程進(jìn)入等待狀態(tài),直到事件被設(shè)置或者超時(shí)(如果指定了超時(shí)時(shí)間)。
autoEvent.WaitOne(); // 無限期等待事件被設(shè)置 bool result = autoEvent.WaitOne(5000); // 在5秒鐘內(nèi)等待事件被設(shè)置
如果寫為 WaitOne(-1) 表示會(huì)使當(dāng)前線程阻塞,直到manualEvent被設(shè)置(即信號量變?yōu)檎妫?br />-1表示無限期地等待下去,直到事件被設(shè)置。如果想指定一個(gè)等待的超時(shí)時(shí)間,可以使用毫秒值作為參數(shù)。
示例
這里提供一個(gè)簡單的例子來展示 EventWaitHandle 的基本用法:
using System;
using System.Threading;
class Program
{
static void Main()
{
EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset);
Thread thread = new Thread(() =>
{
Console.WriteLine("Thread is waiting for the signal.");
eventWaitHandle.WaitOne(); // 線程等待信號
Console.WriteLine("Thread received the signal and continues execution.");
});
thread.Start();
Thread.Sleep(2000); // 主線程等待兩秒后發(fā)送信號
Console.WriteLine("Main thread signals the waiting thread.");
eventWaitHandle.Set(); // 發(fā)送信號
eventWaitHandle.Close(); // 關(guān)閉事件句柄
}
}在這個(gè)例子中,我們創(chuàng)建了一個(gè)手動(dòng)重置類型的 EventWaitHandle 并在線程中等待信號。主線程等待兩秒后發(fā)送信號給等待的線程。當(dāng)信號被發(fā)送后,等待的線程繼續(xù)執(zhí)行。注意,在使用完畢之后,應(yīng)該關(guān)閉 EventWaitHandle。
注意事項(xiàng)
EventWaitHandle可以是命名的,這意味著它可以跨進(jìn)程使用,但示例中沒有展示這一點(diǎn)。- 如果使用命名的
EventWaitHandle,請確保正確處理互斥和權(quán)限問題。 - 在使用完
EventWaitHandle后,應(yīng)當(dāng)調(diào)用Close()方法來釋放資源。
到此這篇關(guān)于C#中EventWaitHandle的用法小結(jié)的文章就介紹到這了,更多相關(guān)C# EventWaitHandle內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#?wpf?通過HwndHost渲染視頻的實(shí)現(xiàn)方法
日常開發(fā)中,特別是音視頻開發(fā),需要在界面上渲染視頻,比如制作一個(gè)播放器、或者視頻編輯工具、以及視頻會(huì)議客戶端。通常拿到的是像素格式數(shù)據(jù),此時(shí)需要渲染到wpf窗口上就需要一定的方法,本文介紹一種通過hwnd渲染的方法,控件既能提供hwnd又能嵌入wpf窗口里2021-11-11
C# NullReferenceException解決案例講解
這篇文章主要介紹了C# NullReferenceException解決案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C#之List集合去重復(fù)對象的實(shí)現(xiàn)方法
這篇文章主要介紹了C#之List集合去重復(fù)對象的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-06-06
C#簡單實(shí)現(xiàn)在網(wǎng)頁上發(fā)郵件的案例
本文分享一個(gè)C#利用SMTP發(fā)送郵件的案例,提供了前后臺代碼,方便大家學(xué)習(xí)。2016-03-03
關(guān)于C#中使用Oracle存儲過程返回結(jié)果集的問題
Oracle中可以使用游標(biāo)(Cursor)對數(shù)據(jù)集進(jìn)行操作,但在存儲過程輸出參數(shù)中直接使用Cursor錯(cuò)誤,下面小編給大家?guī)砹薈#中使用Oracle存儲過程返回結(jié)果集的問題,感興趣的朋友一起看看吧2021-10-10

