我試圖理解用C#撰寫的一段代碼:
static Semaphore _transactionReceived;
static TransactionsSession _transactionsSession;
static void StartTransactionsStream()
{
WriteNewLine("Starting transactions stream ...");
_transactionsSession = new TransactionsSession(AccountID);
_transactionReceived = new Semaphore(0, 100);
_transactionsSession.DataReceived = OnTransactionReceived;
_transactionsSession.StartSession();
bool success = _transactionReceived.WaitOne(10000);
if (success)
WriteNewLine("Good news!. Transactions stream is functioning.");
else
WriteNewLine("Bad news!. Transactions stream is not functioning.");
}
但我無法理解代碼周期中發生的與Sempahore類有關的事情,特別是以下幾行正在做的事情:
_transactionReceived = new Semaphore(0, 100);
和
_transactionReceived.WaitOne(10000)
是在做。
我已經查看并(重新)查看了System.Threading.Semaphore 檔案,我看到建構式“初始化信號量類的新實體,指定初始條目數和最大并發條目數”。 但是有0條目是什么意思呢?
此外,我看到WaitOne(int32)呼叫“阻塞當前執行緒,直到當前 WaitHandle 收到信號,使用 32 位有符號整數指定時間間隔(以毫秒為單位)。” 但同樣,這WaitOne在代碼回圈的背景關系中意味著什么?
關于這是如何執行的任何指標或一般評論都會有所幫助。非常感謝!
uj5u.com熱心網友回復:
但是當有 0 個條目時,這意味著什么?
正是這樣;在Semaphore目前還沒有專案了最大的100。
如果你Semaphore用 with構造了new Semaphore(1, 100);,那么就會有 1 個條目,另外還有 99 個。
需要Semaphore.Release()有 100 個剩余條目。
這
WaitOne在代碼回圈的背景關系中意味著什么?
如果Semaphore有可用條目,即當前條目數不是 100,則它true立即回傳。
否則,它會阻塞當前執行緒,直到一個條目可用(可能由另一個執行緒呼叫Semaphore.Release()),此時該方法回傳true。
如果您指定 a int millisecondsTimeout,則這是Semaphorewill 阻止并等待條目被釋放的最長時間。
如果超過該超時,則該方法回傳false。
uj5u.com熱心網友回復:
信號量說明
ASemaphore是一個同步物件,它允許在代碼段中進行有限程度的并行。
為簡單起見,假設您正在代碼塊(沒有共享實體、全域變數或其他邪惡)上實體化一個全新的信號量。由于多個執行緒可以同時執行同一段代碼,信號量保證只有x它們中的一個可以同時執行同一個塊。
將執行緒視為工人。并非巧合,執行緒通常被稱為作業執行緒。
但是當有 0 個條目時,這意味著什么?
信號量處于紅色狀態,因此在某個執行緒解鎖信號量之前,沒有人可以執行特定的代碼部分。您可以創建一個 GUI,其中多個執行緒為相同的操作競爭,但是通過按下按鈕,您可以解鎖信號量并允許一個執行緒運行。
但同樣,WaitOne 在代碼回圈的背景關系中意味著什么?
這意味著發生以下情況之一:
- 信號量處于綠色狀態,即有許可。執行緒不等待,信號量遞減,操作繼續
- 信號量處于紅色狀態,即沒有可用的許可
- 無論是
WaitOne等待10秒(10000ms),因為沒有許可證是在這段時間內可用 - 或者其他人解鎖信號量和呼叫的執行緒
WaitOne是好的
- 無論是
關于你的代碼
必須有一些其他方法可以釋放信號量,但在示例中未顯示。事實上,你有一個紅色的信號量在那里等待,但顯然沒有人釋放它。我相信這兩行之一隱藏了一個Semaphore.Release方法
_transactionsSession.DataReceived = OnTransactionReceived;
_transactionsSession.StartSession();
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/391652.html
上一篇:如何在C#中原子地執行代碼塊
