C# worker.RunWork())在这种情况下,您必须等待其他人给出答案。ReSharper提供对disposed closure errorSee waitHandle.WaitOne()-waitHandle不应被释放(应在发出waitHandle信号
C# worker.RunWork())在这种情况下,您必须等待其他人给出答案。ReSharper提供对disposed closure errorSee waitHandle.WaitOne()-waitHandle不应被释放(应在发出waitHandle信号,c#,multithreading,waithandle,C#,Multithreading,Waithandle,worker.RunWork())在这种情况下,您必须等待其他人给出答案。ReSharper提供对disposed closure errorSee waitHandle.WaitOne()-waitHandle不应被释放(应在发出waitHandle信号后被释放)。由于您的using子句,waitHandle已被调用。如果在已完成的eventhandler中处理waithandle,则应该可以。不,在大多数情况下,waithandle是在工作完成后处理的(请参见此.worker.RunWork
worker.RunWork())在这种情况下,您必须等待其他人给出答案。ReSharper提供对disposed closure errorSee waitHandle.WaitOne()-waitHandle不应被释放(应在发出waitHandle信号后被释放)。由于您的using子句,waitHandle已被调用。如果在已完成的eventhandler中处理waithandle,则应该可以。不,在大多数情况下,waithandle是在工作完成后处理的(请参见此.worker.RunWork()之后的waithandle.WaitOne())在这种情况下,您必须等待其他人给出答案。ReSharper允许访问disposed closure errorSee waitHandle.WaitOne()-waitHandle不应被释放(它应该在waitHandle发出信号后被释放)。更麻烦的是,当waitHandle.Set()上抛出异常时,另一个线程,创建的waitHandle仍在等待waitHandle.waitOne(),因此using子句在此之前不可能处理waitHandle。您是否费心尝试此操作,或者您只是在进行理论推理?是的,我知道,它会删除异常,但创建waitHandle后引发的任何异常都会阻止线程运行,这将导致处理程序不调用,这将导致未分解的WaitHandle。啊,这是您真正的问题。可能waithandle应该是RunWork中的一个参数,以便实现可以发出“已完成”的信号?已完成的工作由已完成的事件发出信号。更麻烦的是,当在waithandle.Set()上引发异常时,创建waithandle的另一个线程仍在等待waithandle.waitOne(),因此,在那个时候使用子句不可能处理waitHandle。您是否尝试过这个方法,或者您只是在理论上推理?是的,我知道,它会删除异常,但创建waitHandle后抛出的任何异常都会阻止运行线程,这将导致处理程序无法调用,从而导致未处理的waitHandle。啊,这才是你真正的问题。也许waithandle应该是RunWork中的一个参数,以便实现可以发出“已完成”的信号?已完成的工作由已完成的事件发出信号。请参阅此注释-GUI有底层进度更新,因此实际上需要单独的线程。那么,如果UI线程死了,卡在WaitOne()调用上,那又有什么意义呢。是时候开始研究BackgroundWorker类了,它的设计目的是让您避免这样的麻烦。这不是UI线程,当然,它是后台线程,它完成了繁重的工作(worker只是其中的一小部分)。编辑:我实际上使用了BackgroundWorker,但只使用了一小部分时间-我需要一些不同的、更复杂的东西。如果已经有一个工作线程调用WaitOne(),那么启动另一个工作线程就特别没有意义了。一个不做任何工作的工作线程是无用的。请看下面的评论-GUI有底层的进度更新,因此实际上需要单独的线程。那么,如果UI线程死了,卡在WaitOne()调用上,那又有什么意义呢。是时候开始研究BackgroundWorker类了,它的设计目的是让您避免这样的麻烦。这不是UI线程,当然,它是后台线程,它完成了繁重的工作(worker只是其中的一小部分)。编辑:我实际上使用了BackgroundWorker,但只使用了一小部分时间-我需要一些不同的、更复杂的东西。如果已经有一个工作线程调用WaitOne(),那么启动另一个工作线程就特别没有意义了。不做任何工作的辅助线程是无用的。
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;
}
}
}
public Result GetResult()
{
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();
waitHandle.Dispose();
});
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;
}
}
var handler = Completed;
if (handler != null)
{
handler(...);
}