2012-01-07 82 views
10

我想創建以通用的方式來使用的一些方法中,最佳的方法是,將阻止(除非某個超時),直到一個給定的條件被滿足。爲「塊」,直到某些條件得到滿足

在代碼中的使用將是類似於:

WaitUntil(condition); 

我曾嘗試使用while(..)循環實現它,但是這似乎是一種浪費。

在當前的實現中,我初始化「一次性」計時器,在超時期滿。我正在運行一個while循環,並檢查定時器是否超時,如果發生異常則拋出異常。

是否有任何簡單而有效的技術來實現這種方法?

+0

我會考慮委託和事件 – Joe 2012-01-07 16:56:25

+3

互斥,信號燈,ManualResetEvent的,的AutoResetEvent,CountdownEvent等等看System.Threading命名空間 – 2012-01-07 17:04:09

+3

說技術上更要的東西同步。操作系統提供的機制可以避免在while循環中忙於等待。 Yoy有多種選擇:信號量,臨界區,手動/自動重置事件等等。要選擇一個你應該說什麼是你正在等待的condiition。一個同步的通用函數是WaitForSingleObject。 – pkmiec 2012-01-07 17:08:12

回答

4

阻塞條件可以工作(我個人傾向於使用Monitor),但是,在大多數情況下,我會建議以更異步的方式編碼,這意味着:不是等待,而是註冊某種回調當情況發生時發生。這可以通過一個事件,或者最近的一個任務繼續(ContinueWith)。在c#5中,這進一步擴展了「await」的隱喻,這使得這個透明的I.e.

var foo = StartSomeWork(); 
... 
var result = await foo; 
Console.WriteLine(result); 

看起來像是在「等待」堵 - 但它實際上是完全相反的(假定任務是不是已經完成);這會註冊一個被調用的延續,當數據變得可用時,很可能在不同的線程上調用

+1

用於提及異步的+1 – diggingforfire 2012-01-07 18:22:17

+0

此代碼的唯一問題是:我們使用的是.NET 3.5,而版本5還沒有出來:) CTP工作在3.5上嗎? (我不這麼認爲)。 – 2012-01-07 23:04:48

+0

@liortal你可以在4.0上使用ContinueWith;我不會使用CTP生產代碼 – 2012-01-07 23:36:13

相關問題