国产探花免费观看_亚洲丰满少妇自慰呻吟_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://www.survivalescaperooms.com/qingyun163/archive/2013/01/05/2846633.html

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 施甸县| 凌海市| 东光县| 乌海市| 台山市| 浦县| 岳西县| 和顺县| 吴旗县| 蓬莱市| 阿拉尔市| 阿克苏市| 通江县| 文昌市| 武隆县| 嵩明县| 丰顺县| 江山市| 竹北市| 偃师市| 柯坪县| 广丰县| 西乡县| 吴桥县| 台安县| 和林格尔县| 宁陵县| 邛崃市| 郧西县| 雷波县| 大竹县| 广安市| 云和县| 五大连池市| 宾阳县| 兖州市| 奉新县| 贵阳市| 自治县| 思南县| 诸城市|