autoresetevent允許執行緒通過發訊號互相通訊。通常,此通訊涉及執行緒需要獨佔訪問的資源。
執行緒通過呼叫autoresetevent上的 waitone 來等待訊號。如果autoresetevent處於非終止狀態,則該執行緒阻塞,並等待當前控制資源的執行緒
通過呼叫 set 發出資源可用的訊號。
呼叫set向autoresetevent發訊號以釋放等待執行緒。autoresetevent將保持終止狀態,直到乙個正在等待的執行緒被釋放,然後自動返回非終止
狀態。如果沒有任何執行緒在等待,則狀態將無限期地保持為終止狀態。
可以通過將乙個布林值傳遞給建構函式來控制autoresetevent的初始狀態,如果初始狀態為終止狀態,則為true;否則為false。
通俗的來講只有等myreseteven.set()成功執行後,myreseteven.waitone()才能夠獲得執行機會;set是發訊號,waitone是等待訊號,只有發了訊號,
等待的才會執行。如果不發的話,waitone後面的程式就永遠不會執行。下面我們來舉乙個例子:我去書店買書,當我選中一本書後我會去收費處付錢,
付好錢後再去倉庫取書。這個順序不能顛倒,我作為主線程,收費處和倉庫做兩個輔助線程,**如下:
usingautoresetevent與manualresetevent的區別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
); }}}
}執行結果如下:
他們的用法\宣告都很類似,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 ...
關於冷漠,關於愛情
我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...