目錄假如,程式需要向乙個 web 傳送 5 次請求,受網路波動影響,有一定機率請求失敗。如果失敗了,就需要重試。
示例**如下:
class program
console.writeline("任務執行完畢");
}// 模擬網路請求
}// 完成一次任務,+1
interlocked.add(ref count,1);
console.writeline($"完成任務,count=");
}}
**太糟糕了,但我們可以使用 countdownevent 類來改造它。
表示在計數變為零時處於有訊號狀態的同步基元。
也就是說,設定乙個計數器,每個執行緒完成後,就會減去 1 ,當計數器為 0 時,代表所有執行緒都已經完成了任務。
countdownevent 類的建構函式如下:
建構函式
說明countdownevent(int32)
使用指定計數初始化 countdownevent 類的新例項。
countdownevent 類的常用方法如下:
方法說明
addcount()
將 countdownevent 的當前計數加 1。
addcount(int32)
將 countdownevent 的當前計數增加指定值。
reset()
將 currentcount 重置為 initialcount 的值。
reset(int32)
將 initialcount 屬性重新設定為指定值。
signal()
向 countdownevent 註冊訊號,同時減小 currentcount 的值。
signal(int32)
向 countdownevent 註冊多個訊號,同時將 currentcount 的值減少指定數量。
tryaddcount()
增加乙個 currentcount 的嘗試。
tryaddcount(int32)
增加指定值的 currentcount 的嘗試。
wait()
阻止當前執行緒,直到設定了 countdownevent 為止。
wait(cancellationtoken)
阻止當前執行緒,直到設定了 countdownevent 為止,同時觀察 cancellationtoken。
wait(int32)
阻止當前執行緒,直到設定了 countdownevent 為止,同時使用 32 位帶符號整數測量超時。
wait(int32, cancellationtoken)
阻止當前執行緒,直到設定了 countdownevent 為止,並使用 32 位帶符號整數測量超時,同時觀察 cancellationtoken。
wait(timespan)
阻止當前執行緒,直到設定了 countdownevent 為止,同時使用 timespan 測量超時。
wait(timespan, cancellationtoken)
阻止當前執行緒,直到設定了 countdownevent 為止,並使用 timespan 測量超時,同時觀察 cancellationtoken。
api 比較多,沒事,我們來慢慢了解它。
我們來編寫乙個場景**,乙個有五件事,需要完成,分別派出 5 個人去實現。
.wait();
用在乙個執行緒中,這個執行緒將等待其它完成都完成任務後,才能繼續往下執行。
signal();
用於工作執行緒中,向 countdownevent 物件傳送訊號,告知執行緒已經完成任務,然後countdownevent.currentcount
將減去 1。
當計數器為 0 時,阻塞的執行緒將恢復執行。
**示例如下:
class program
";thread.start();
}// 等他們都完成事情
countd.wait();
console.writeline("任務完成,執行緒退出");
console.readkey();
}public static void doone()
完成一件事了");
}}
示例很簡單,每個執行緒在完成自己的任務時,需要呼叫signal()
方法,使得計數器減去1。
.wait();
可以等待所有的任務完成。
需要注意的是,如果不呼叫signal()
或者計數器一直不為0,那麼wait()
將無限等待。
當然,wait()
可以設定等待時間,
另外我們也看到了常用方法中有addcount()
、reset()
等。
這個類的等待控制方式比較寬鬆,wait()
後,到底什麼時候才能執行,全憑其它執行緒自覺。
如果發現執行緒執行任務失敗,我們可以不呼叫signal()
或者 使用addcount()
來增加次數,進行重試
c 執行緒池 多執行緒
1。設定引數類 using system using system.collections.generic using system.text public class stateinfo 執行緒開啟方法類 using system using system.collections.generic ...
C 多執行緒 建立執行緒
c 中線程的建立一般是通過std thread類實現的,具體的實現方式有以下幾種 void operator int a 過載括號運算子。如果無參則為void operator 這裡有兩種方法通過成員函式建立。而這兩種方法恰好也就是靜態成員函式和非靜態成員函式的區別。靜態成員函式與物件無關,只屬於類...
C 多執行緒 執行緒安全
當使用多執行緒時,可能存在同時訪問乙個變數,導致變數被汙染問題,所以需要通過程式設計克服這個問題。採用多個執行緒,分別記數,然後檢視最終計算結果,如下 include include include 計數全域性變數 long cnt 0 計數程式 void counter int main int ...