我正在编写一个与多个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