什么是阻止连续背景工作者处置的真正工作方式?

时间:2016-03-09 08:39:39

标签: c# backgroundworker dispose

我们正在使用持续的背景工作者并且有问题阻止它们正确。我们尝试了不同的版本:

BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(http_manager_get_async_overloads, http_manager::get_async, 1, 5)

class_<http_manager, noncopyable>("HttpManager", no_init)
    .def("get_async", &http_manager::get_async, http_manager_get_async_overloads(args("url", "headers", "data", "on_response", "on_write")))
    ;

嗯,这种变体有时会在

处陷入僵局
bw.WorkerReportsProgress       = true;
bw.WorkerSupportsCancellation  = true;
bw.DoWork                     += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged            += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted         += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);    
evCompl                        = new AutoResetEvent( false );

private void bw_DoWork(object sender, DoWorkEventArgs e) {
    while(!bw.CancellationPending ) {
        // sleep or do time wasting stuff 
        bw.ReportProgress( 0, /*some Data*/ );
    }
    if( bw.CancellationPending ) {
        e.Cancel = true;
    }
    evCompl.Set(); 
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e) {
    Data d = (Data)e.Data;
    // sometimes do some Gui stuff with invoking
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)  {
   // ... 
}
protected virtual void Disposing( bool disposing )
{
     if( bw!=null ) {
         bw.CancelAsync();
         evCompl.WaitOne();

         bw.DoWork             -= new DoWorkEventHandler(bw_DoWork);
         bw.ProgressChanged    -= new ProgressChangedEventHandler(bw_ProgressChanged);
         bw.RunWorkerCompleted -= new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
         bw.Dispose();
     }
   }

并且永远不会调用bw_RunWorkerCompleted。使用定时等待,例如evCompl.WaitOne(2000)(什么是一个比循环周期更高的值)会导致titme到时间空指针异常。

另一个非空指针异常免费变体是:

evCompl.WaitOne();

但我的理由可能是&#34; bw = null&#34; - &GT;在DoWork bw中使用 - &gt;如果bw之前设置为null,则为null指针访问。

最后,我需要一个可靠的方法来停止Dispose中的bw并确保它已经停止。我们对bw.CancellationPending进行了大量检查,以尽快打破while循环。但我尝试的每一种方式都有一些副作用。

是的:我也阅读了很多有关该主题的主题......

0 个答案:

没有答案