我想创建一些以通用方式使用的方法,它是否会阻塞(除非某个超时到期),直到满足给定条件。
代码中的用法类似于:
WaitUntil( condition );
我尝试使用While(..)循环实现它,但这似乎是浪费。
在目前的实施中,我正在初始化一个在TIMEOUT到期的“一次性”计时器。我正在运行一个while循环,并检查计时器是否已超时,如果有则抛出异常。
是否有任何简单而有效的技术来实现这种方法?
答案 0 :(得分:10)
查看Albahari's threading article,尤其是basic synchronization
部分以及ManualResetEvent和AutoResetEvent。这将使您对.NET中的信令构造有一个很好的了解。
答案 1 :(得分:4)
阻止条件可以工作(我倾向于亲自使用Monitor),但是,在大多数情况下,我会建议在这里以更加异步的方式编码,这意味着:而不是等待,你注册某种回调发生当条件发生时。这可能是通过一个事件,或者最近是一个继续任务(ContinueWith)。在c#5中,这进一步扩展了“await”比喻,使其变得透明,即。
var foo = StartSomeWork();
...
var result = await foo;
Console.WriteLine(result);
这个看起来就像它在“等待”中阻塞一样 - 但事实上恰恰相反(假设任务尚未完成);这会注册一个在数据可用时调用的延续,很可能是在另一个线程上。