關於AutoResetEvent的使用

2021-08-31 04:12:36 字數 2463 閱讀 4005

autoresetevent允許執行緒通過發訊號互相通訊。通常,此通訊涉及執行緒需要獨佔訪問的資源。

執行緒通過呼叫autoresetevent上的 waitone 來等待訊號。如果autoresetevent處於非終止狀態,則該執行緒阻塞,並等待當前控制資源的執行緒

通過呼叫 set 發出資源可用的訊號。

呼叫setautoresetevent發訊號以釋放等待執行緒。autoresetevent將保持終止狀態,直到乙個正在等待的執行緒被釋放,然後自動返回非終止

狀態。如果沒有任何執行緒在等待,則狀態將無限期地保持為終止狀態。

可以通過將乙個布林值傳遞給建構函式來控制autoresetevent的初始狀態,如果初始狀態為終止狀態,則為true;否則為false

通俗的來講只有等myreseteven.set()成功執行後,myreseteven.waitone()才能夠獲得執行機會;set是發訊號,waitone是等待訊號,只有發了訊號,

等待的才會執行。如果不發的話,waitone後面的程式就永遠不會執行。下面我們來舉乙個例子:我去書店買書,當我選中一本書後我會去收費處付錢,

付好錢後再去倉庫取書。這個順序不能顛倒,我作為主線程,收費處和倉庫做兩個輔助線程,**如下:

using 

system;

using

system.linq;

using

system.activities;

using

system.activities.statements;

using

system.threading;

namespace

caryaredemo

", i);

number = i;

//signal that a value has been written.

myresetevent.set();

changeevent.set();

thread

.sleep(0

); }

paymoneythread.abort();

getbookthread.abort();

}static void

paymoneyproc()

:數量"

, thread

.currentthread.name, number);}}

static void

getbookproc()

:數量"

, thread

.currentthread.name, number);

console

.writeline("------------------------------------------"

); thread

.sleep(0

); }}}

}執行結果如下:

autoresetevent與manualresetevent的區別

他們的用法\宣告都很類似,set方法將訊號置為傳送狀態 reset方法將訊號置為不傳送狀態waitone等待訊號的傳送。其實,從名字就可以看出乙個手動,

乙個自動,這個手動和自動實際指的是在reset方法的處理上,如下面例子:

public autoresetevent autoevent=new autoresetevent(true);

public manualresetevent manualevent=new manualresetevent(true);

預設訊號都處於傳送狀態,

autoevent.waitone();

manualevent.waitone();

如果 某個執行緒呼叫上面該方法,則當訊號處於傳送狀態時,該執行緒會得到訊號,得以繼續執行。差別就在呼叫後,autoevent.waitone()每次只允許乙個執行緒

進入,當某個執行緒得到訊號(也就是有其他執行緒呼叫了autoevent.set()方法後)後,autoevent會自動又將訊號置為不傳送狀態,則其他呼叫waitone的執行緒只

有繼續等待.也就是說,autoevent一次只喚醒乙個執行緒。而manualevent則可以喚醒多個執行緒,因為當某個執行緒呼叫了set方法後,其他呼叫waitone的執行緒

獲得訊號得以繼續執行,而manualevent不會自動將訊號置為不傳送.也就是說,除非手工呼叫了manualevent.reset().方法,則 manualevent將一直保持有訊號狀態,manualevent也就可以同時喚醒多個執行緒繼續執行。如果上面的程式換成 manualresetevent的話,就需要在waitone後面做下reset。

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...