我想創建以通用的方式來使用的一些方法中,最佳的方法是,將阻止(除非某個超時),直到一個給定的條件被滿足。爲「塊」,直到某些條件得到滿足
在代碼中的使用將是類似於:
WaitUntil(condition);
我曾嘗試使用while(..)循環實現它,但是這似乎是一種浪費。
在當前的實現中,我初始化「一次性」計時器,在超時期滿。我正在運行一個while循環,並檢查定時器是否超時,如果發生異常則拋出異常。
是否有任何簡單而有效的技術來實現這種方法?
我想創建以通用的方式來使用的一些方法中,最佳的方法是,將阻止(除非某個超時),直到一個給定的條件被滿足。爲「塊」,直到某些條件得到滿足
在代碼中的使用將是類似於:
WaitUntil(condition);
我曾嘗試使用while(..)循環實現它,但是這似乎是一種浪費。
在當前的實現中,我初始化「一次性」計時器,在超時期滿。我正在運行一個while循環,並檢查定時器是否超時,如果發生異常則拋出異常。
是否有任何簡單而有效的技術來實現這種方法?
阻塞條件可以工作(我個人傾向於使用Monitor),但是,在大多數情況下,我會建議以更異步的方式編碼,這意味着:不是等待,而是註冊某種回調當情況發生時發生。這可以通過一個事件,或者最近的一個任務繼續(ContinueWith)。在c#5中,這進一步擴展了「await」的隱喻,這使得這個透明的I.e.
var foo = StartSomeWork();
...
var result = await foo;
Console.WriteLine(result);
這看起來像是在「等待」堵 - 但它實際上是完全相反的(假定任務是不是已經完成);這會註冊一個被調用的延續,當數據變得可用時,很可能在不同的線程上調用。
用於提及異步的+1 – diggingforfire 2012-01-07 18:22:17
此代碼的唯一問題是:我們使用的是.NET 3.5,而版本5還沒有出來:) CTP工作在3.5上嗎? (我不這麼認爲)。 – 2012-01-07 23:04:48
@liortal你可以在4.0上使用ContinueWith;我不會使用CTP生產代碼 – 2012-01-07 23:36:13
看看Albahari's threading article,特別是basic synchronization
部分和ManualResetEvent和AutoResetEvent。這將給你一個關於.NET中的信號構造的好主意。
我會考慮委託和事件 – Joe 2012-01-07 16:56:25
互斥,信號燈,ManualResetEvent的,的AutoResetEvent,CountdownEvent等等看System.Threading命名空間 – 2012-01-07 17:04:09
說技術上更要的東西同步。操作系統提供的機制可以避免在while循環中忙於等待。 Yoy有多種選擇:信號量,臨界區,手動/自動重置事件等等。要選擇一個你應該說什麼是你正在等待的condiition。一個同步的通用函數是WaitForSingleObject。 – pkmiec 2012-01-07 17:08:12