这段代码大部分时间都有效,所以我在考虑一些竞争条件。结果类是不可变的,但我认为问题不在于该类。
public Result GetResult()
{
using (var waitHandle = new ManualResetEvent(false))
{
Result result = null;
var completedHandler = new WorkCompletedEventHandler((o, e) =>
{
result = e.Result;
// somehow waitHandle is closed, thus exception occurs here
waitHandle.Set();
});
try
{
this.worker.Completed += completedHandler;
// starts working on separate thread
// when done, this.worker invokes its Completed event
this.worker.RunWork();
waitHandle.WaitOne();
return new WorkResult(result);
}
finally
{
this.worker.Completed -= completedHandler;
}
}
}
编辑:抱歉,在调用 GetResult() 方法之前,我错过了对 this.worker.RunWork() 的调用。这显然导致(有时)两次执行相同的工作,尽管我不确定为什么 waitHandle 在waitHandle.Set()之前关闭,尽管 Completed 事件触发了两次。这根本没有影响 IO 工作(结果是正确的;在我更改代码以手动关闭waitHandle 之后)。
因此,即使问题不完整,铱星的答案也应该是最接近的答案(如果不是正确的答案)。