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

lys*_*cid 10 .net c# blocking

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

代码中的用法类似于:

WaitUntil( condition );
Run Code Online (Sandbox Code Playgroud)

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

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

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

dig*_*ire 10

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


Mar*_*ell 4

阻塞某个条件是可行的(我个人倾向于使用 Monitor),但是,在大多数情况下,我建议在这里以更异步的方式进行编码,这意味着:您可以注册某种回调,以便在条件满足时发生,而不是等待发生。这可以通过事件实现,或者最近通过延续任务 (ContinueWith) 实现。在 c# 5 中,这通过“等待”隐喻进一步扩展,使其变得透明,即

var foo = StartSomeWork();
...
var result = await foo;
Console.WriteLine(result);
Run Code Online (Sandbox Code Playgroud)

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