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

时间:2012-01-07 16:54:49

标签: c# .net blocking

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

代码中的用法类似于:

WaitUntil( condition );

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

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

是否有任何简单而有效的技术来实现这种方法?

2 个答案:

答案 0 :(得分:10)

查看Albahari's threading article,尤其是basic synchronization部分以及ManualResetEventAutoResetEvent。这将使您对.NET中的信令构造有一个很好的了解。

答案 1 :(得分:4)

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

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

这个看起来就像它在“等待”中阻塞一样 - 但事实上恰恰相反(假设任务尚未完成);这会注册一个在数据可用时调用的延续,很可能是在另一个线程上。