相关疑难解决方法(0)

如何等待BackgroundWorker取消?

考虑一个对象的假设方法,为您做一些事情:

public class DoesStuff
{
    BackgroundWorker _worker = new BackgroundWorker();

    ...

    public void CancelDoingStuff()
    {
        _worker.CancelAsync();

        //todo: Figure out a way to wait for BackgroundWorker to be cancelled.
    }
}
Run Code Online (Sandbox Code Playgroud)

如何等待BackgroundWorker完成?


在过去,人们尝试过:

while (_worker.IsBusy)
{
    Sleep(100);
}
Run Code Online (Sandbox Code Playgroud)

但是这种死锁,因为IsBusyRunWorkerCompleted事件处理之后才会被清除,并且在应用程序空闲之前无法处理该事件.在工人完成之前,应用程序不会闲置.(另外,这是一个繁忙的循环 - 恶心.)

其他人已添加建议将其融入:

while (_worker.IsBusy)
{
    Application.DoEvents();
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是Application.DoEvents()导致当前队列中的消息被处理,这会导致重入问题(.NET不可重入).

我希望使用一些涉及事件同步对象的解决方案,其中代码等待事件 - 工作者的RunWorkerCompleted事件处理程序设置.就像是:

Event _workerDoneEvent = new WaitHandle();

public void CancelDoingStuff()
{
    _worker.CancelAsync();
    _workerDoneEvent.WaitOne();
}

private void RunWorkerCompletedEventHandler(sender object, …
Run Code Online (Sandbox Code Playgroud)

.net c# multithreading backgroundworker

119
推荐指数
3
解决办法
8万
查看次数

标签 统计

.net ×1

backgroundworker ×1

c# ×1

multithreading ×1