我正在編寫一個與多個WCF終端進行通信的庫。在很多情況下,我必須等待遠程服務的特定狀態或條件。我寫了一個簡單的投票等待循環,看起來是這樣的:阻止輪詢等待循環執行的更好方法?
private bool WaitForTrue(Func<bool> action, TimeSpan waitTime, TimeSpan checkInterval)
{
DateTime end = DateTime.UtcNow + waitTime;
while (DateTime.UtcNow < end)
{
if (action())
{
return true;
}
Thread.Sleep(checkInterval);
}
return action();
}
閱讀severalposts約Thread.Sleep
是如何設計不良的節目的標誌後,我重新評估每一個我用它的地方。我正在努力用最好的方式來取代它在這個等待循環中的使用。我見過使用Task.Delay
的建議,但由於我必須阻止執行,因此我認爲我將不得不使用Task.Delay(checkInterval).Wait()
,這似乎並不能提供任務的典型優勢。
我知道使用基於回調/基於事件的WCF方法而不是輪詢的優點,但不幸的是,我無法修改服務端點來公開這種功能。
我的庫沒有使用任何多線程,但我希望它對希望多線程應用程序的消費者友好。
正在取代Thread.Sleep
與Task.Delay.Wait()
的路要走,還是有更好的方法來實現阻塞等待循環?
爲什麼沒有計時器並在其事件上執行該功能? – Ewan 2015-04-02 16:04:20
@Ewan我也看到了這個建議,但是我很難想象這會如何工作。你介意用一個例子發佈一個答案嗎? – 2015-04-02 16:46:31
因此,您正在輪詢遠程服務,該服務無法通知您? – usr 2015-04-02 17:09:52