无论出于何种原因,ThreadPool
's QueueWorkItem
不返回IAsyncResult
或工作项的其他一些句柄,这将允许等待它完成。有RegisterWait...
方法,但你必须通过WaitHandle
并且创建它们是昂贵的(参见IAsyncResult
文档,建议您推迟创建WaitHandle
直到要求为止)。任务并行库将解决这个缺陷,但需要等待很长时间才能可用。那么,这样的设计有没有什么问题:
public class Concurrent<T> {
private ManualResetEvent _resetEvent;
private T _result;
public Concurrent(Func<T> f) {
ThreadPool.QueueUserWorkItem(_ => {
_result = f();
if (_resetEvent != null)
_resetEvent.Set();
});
}
public WaitHandle WaitHandle {
get {
if (_resetEvent == null)
_resetEvent = new ManualResetEvent(_result != null);
return _resetEvent;
}
...
编辑:
我问了一个关于使用异步委托而不是线程池时出现的问题的后续问题.
嗯,在获取 WaitHandle 和设置它之间存在竞争条件。如果来电者碰巧迟到了一点点,您真的希望他们永远等待吗?
您可能应该做一些适当的锁定并保留“我已经完成”标志,以便如果您do完成后创建 WaitHandle,在返回之前设置它。
我还会亲自编写一个静态工厂方法,而不仅仅是使用公共构造函数 - 或者将其设为“创建并then显式启动”模式。在构造函数中对工作项进行排队对我来说感觉很奇怪。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)