Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# worker.RunWork())在这种情况下,您必须等待其他人给出答案。ReSharper提供对disposed closure errorSee waitHandle.WaitOne()-waitHandle不应被释放(应在发出waitHandle信号_C#_Multithreading_Waithandle - Fatal编程技术网

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(...);
}