国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

AutoResetEvent和ManualResetEvent理解

2019-11-17 02:33:27
字體:
來源:轉載
供稿:網友

AutoResetEvent和ManualResetEvent理解

AutoResetEvent和ManualResetEvent用于多線程之間代碼執行順序的控制,它們繼承自WaitHandle,API相同,但在使用中還是有區別的。

每次使用時雖然理解了,但由于沒有去深入思考記憶,過幾天又忘記了。到下次需要使用的時候又要重新去理解這2個類。

今天再次遇到他們,寫下這篇隨筆。。加深理解印象。以后不用去糾結他們了。

1.構造函數參數

var manualResetEventWaitHandle = new ManualResetEvent(true);

var autoResetEventResetEventWaitHandle = new AutoResetEvent(true);

MSDN的解釋:True有信號,False無信號

為True,代碼執行過程中遇到WaitHandle.WaitOne()的時候,(有了信號)不會阻塞該線程,將會繼續執行下去。

如為False,遇到WaitHandle.WaitOne()的時,當前線程被掛起(沒有信號,等待信號),直到另一個線程執行WaitHandle.Set(),線程才會繼續執行WaitHandle.WaitOne后面的代碼

2.Set和Reset方法

MSDN的解釋:Set為終止狀態(有信號),Reset設置為非終止狀態(沒有信號

結合構造函數的參數這樣比較好理解了。

var waitHandle = new ManualResetEvent/AutoResetEvent(false)

waitHandle.Set()

等價于

var waitHandle = new ManualResetEvent/AutoResetEvent(true)

同理

var waitHandle = new ManualResetEvent/AutoResetEvent(true)

waitHandle.Reset()

等價于

var waitHandle = new ManualResetEvent/AutoResetEvent(false)

3.AutoResetEvent和ManualResetEvent

輪到主角了。以地鐵閘機為比喻,閘機開啟(沒有信號) 乘客來到閘機前無法通行(WaitOne),刷卡(Set)后,閘機關閉(有信號),乘客進入。然后閘機再開啟(沒信號),

高亮就是它們的區別了。可以想象一般情況下閘機是一個AutoResetEvent,每當通過一個客人后,閘機又開啟,閘機遇到了故障第一個人刷卡進入后,閘機還是處于關閉,這樣之后的乘客不用WaitOne可以繼續進入

也就是

autoResetEventResetEventWaitHandle.Set()

等同于

manualResetEventWaitHandle.Set()

manualResetEventWaitHandle.Reset();

補充 ManualResetEventSlim

Framework4中的ManualResetEvent輕量級優化版,推薦使用

參考:

http://m.survivalescaperooms.com/qingyun163/archive/2013/01/05/2846633.html

http://baike.baidu.com/link?url=Cu-Oakr8hkaYtpg9hPTMuuUtAiMdSBc-f_LCs3-dtWTcYSIvbl9b22AKi63MyZ3I9RtmYtUCnYtVFsjTrQiNVq


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泰安市| 抚宁县| 隆林| 名山县| 安吉县| 中牟县| 祥云县| 磴口县| 鄱阳县| 蓝山县| 潜江市| 平罗县| 惠东县| 宁海县| 封开县| 邵阳县| 临沂市| 高台县| 洛隆县| 富顺县| 郴州市| 林芝县| 怀宁县| 萍乡市| 尼勒克县| 朝阳县| 华阴市| 故城县| 孝感市| 喀喇沁旗| 金湖县| 彭山县| 邓州市| 嵊泗县| 绥江县| 白河县| 当阳市| 梧州市| 咸丰县| 霞浦县| 清远市|