“阻止”直到满足某些条件的最佳方法

我想创建一些以通用方式使用的方法,它是否会阻塞(除非某个超时到期),直到满足给定条件。

代码中的用法类似于:

WaitUntil( condition ); 

我尝试使用While(..)循环实现它,但这似乎是浪费。

在当前的实现中,我正在初始化一个在TIMEOUT到期的“一次性”计时器。 我正在运行一个while循环,并检查计时器是否已超时,如果有,则抛出exception。

有没有简单而有效的技术来实现这种方法?

阻止一个条件可以工作(我倾向于亲自使用Monitor),但是,在大多数情况下,我会建议在这里以更加异步的方式编码,这意味着:而不是等待,你注册了某种类型的回调,当条件发生时发生。 这可能是通过一个事件,或者最近是一个继续任务(ContinueWith)。 在c#5中,这进一步扩展了“等待”比喻,这使得这个透明,即

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

似乎是在“等待”时阻塞 – 但实际上恰恰相反(假设任务尚未完成); 这会注册一个在数据可用调用的延续,很可能是在不同的线程上。

看看Albahari的线程文章 ,尤其是basic synchronization部分以及ManualResetEvent和AutoResetEvent 。 这将使您对.NET中的信令构造有一个很好的了解。