SpinWait.SpinUntil(() => myPredicate(), 10000)
爲超時10000ms
或
它是更有效地使用Thread.Sleep
輪詢相同的條件 例如東西沿着以下SleepWait
的線功能:
public bool SleepWait(int timeOut)
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut)
{
Thread.Sleep(50)
}
return myPredicate()
}
我是con如果我們談論超過1秒的超時,那麼SpinWait的所有屈服可能都不是一個好的使用模式?這是一個有效的假設嗎?
你更喜歡哪種方法?爲什麼?還有另一種更好的方法嗎?
更新 - 成爲更具體:
有沒有一種方法,使BlockingCollection脈衝睡眠線程,當它到達界能力?正如Marc Gravel所建議的,我寧願避免忙於等待。
謝謝,我喜歡你的答案,這將是不錯的。假設您正在通過BlockingCollection跟蹤一些資源的使用情況。它們被使用(並從集合中移除)並在它們再次可用以供重用時返回到集合。關閉只能在所有這些都返回到集合中時纔會發生。除了忙碌的等待之外,你會如何去發信號通知關機可以繼續(即收集再次充滿)? – Anastasiosyal 2012-03-15 12:03:31
@Anastasiosyal我會封裝集合,並讓封裝器在完成時做某些事情;實際上,我可能會爲此使用一個「Monitor」(將添加示例) – 2012-03-15 12:07:55
在從BlockingQueue下降的ObjectPool類的析構函數中,逐個彈出BlockingCollection中的所有對象並處理它們,(因爲這是C#,請將檢索到的引用設置爲nil),直到彈出的對象數等於池深度。所有池中的對象都被丟棄了,所以你可以放棄隊列並從Dtor返回來繼續關閉序列。不需要輪詢/忙碌等待!您可能需要在該服務上放一些超時,以便泄漏的對象最終引發異常(或某種情況)。 – 2012-03-15 12:12:33