我有一个面向所有对象的可移植类库。正因为如此,没有任务或异步支持。这是非常痛苦的。
所以,我试图实现一个通用的扩展方法,使操作可以超时。这是我目前所看到的:
public static bool WithTimeout(Action task, int duration)
{
bool complete=false;
ThreadPool.QueueUserWorkItem((o) =>
{
task();
complete = true;
});
int timeout = 0;
while (!complete)
{
new ManualResetEvent(false).WaitOne(1);
timeout++;
if (timeout > duration)
{
return false;
}
}
return true;
}
这看起来很可能是错的,而且很难看。有没有更好的办法?
@Hans说要正确使用ManualResetEvent。这样做之后,我最终得到了这个(更好的)代码:
public static bool WithTimeout(Action task, int duration)
{
var e=new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem((o) =>
{
task();
e.Set();
});
return e.WaitOne(duration);
}
如果你想要异步和任务支持,我强烈建议你看看微软的BCL库。它与可移植类库兼容。
用nuget搜索即可。
http://nuget.org/packages/Microsoft.Bcl.Async/