寫測試工具需要多執行緒的暫停終止。用c#的 thread.about() join() resume() suspend()又提示函式過時了,不建議使用。於是四處找方法,訊號量、互斥鎖什麼的方法也不少,找到下面這個方法,倒是很實用,**如下:
autoresetevent允許執行緒通過發訊號互相通訊。通常,此通訊涉及執行緒需要獨佔訪問的資源。
執行緒通過呼叫autoresetevent上的 waitone 來等待訊號。如果autoresetevent處於非終止狀態,則該執行緒阻塞,並等待當前控制資源的執行緒
通過呼叫 set 發出資源可用的訊號。
呼叫set向autoresetevent發訊號以釋放等待執行緒。autoresetevent將保持終止狀態,直到乙個正在等待的執行緒被釋放,然後自動返回非終止狀態。如果沒有任何執行緒在等待,則狀態將無限期地保持為終止狀態。
可以通過將乙個布林值傳遞給建構函式來控制autoresetevent的初始狀態,如果初始狀態為終止狀態,則為true;否則為false。
通俗的來講只有等myreseteven.set()成功執行後,myreseteven.waitone()才能夠獲得執行機會;set是發訊號,waitone是等待訊號,只有發了訊號,
等待的才會執行。如果不發的話,waitone後面的程式就永遠不會執行。下面我們來舉乙個例子:我去書店買書,當我選中一本書後我會去收費處付錢,
付好錢後再去倉庫取書。這個順序不能顛倒,我作為主線程,收費處和倉庫做兩個輔助線程,**如下:
using system;autoresetevent與manualresetevent的區別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。
如何暫停和終止執行緒
你能看到這篇文章,說明你已經知道如何建立執行緒了,因此,這裡就不說明執行緒的建立了,詳細說一下執行緒的暫停和終止。我們首先了解一下,什麼是前台執行緒和後台執行緒。net的公用語言執行時 clr 能區分兩種不同型別的執行緒 前台執行緒和後台執行緒。這兩者的區別就是 應用程式必須執行完所有的前台執行緒才...
c 終止執行緒
最近在弄乙個等待視窗,使用了執行緒去呼叫form。在結束執行緒這邊碰到了些問題。呼叫 thread.abort thread.join 老被threadabortexception異常丟擲困擾。後來上網查詢了相關資訊,發現thread.abort 就是通過threadabortexception異常...
android Thread 停止 開始 暫停
package com.example.thread import android.os.bundle import android.view.menu import android.view.view import android.view.view.onclicklistener import ...