我们正在使用持续的背景工作者并且有问题阻止它们正确。我们尝试了不同的版本:
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循环。但我尝试的每一种方式都有一些副作用。
是的:我也阅读了很多有关该主题的主题......