我在Windows Phone 7上的Application_Deactivated事件中取消后台工作程序时遇到了一些问题。
我的后台工作人员正在与一个Web服务同步,但由于我无法猜测它需要多长时间才能取消该工作人员。问题在于,在事件处理程序完成后,应用程序将终止所有线程,因此我无法正确取消它。
我想做的是这样的事情:
Application_Deactivated
{
Backgroundworker.RunWorkerCompleted += bw_completed;
Backgroundworker.Cancel async
// wait till completed event which confirm the background thread has been cancelled
}
我首先尝试在事件处理程序中使用AutoResetEvent,但这不起作用,因为App.xaml.cs Thread是应用程序的主线程,并且在此线程中等待将阻止整个应用程序。
在事件处理程序中调用了cancelAsync之后,应用程序将处于休眠状态,并且当恢复在实际后台工作程序中调用的Web处理程序时,将提供有关对Web响应的空引用的错误。
我已经在后台工作程序中检查取消等待,并且已使用取消按钮测试取消功能,因此这不是问题。纯粹是我需要等到后台工作人员正确退出。
我在这个网站上发现了一些像这样的结果: How close BackgroundWorker thread when application is deactivated?
但是这只给出了ThreadAbortException的解决方案,但我宁愿不使用这个。
如果您需要更多代码,我可以提供。
答案 0 :(得分:0)
您的线程正在关闭,因为它们是后台线程。当一个应用程序关闭时,所有后台线程都会关闭,你无能为力。
您可以创建前台线程。该应用程序将不会/不能终止前台线程,并将运行直到前台线程终止。
要使用此方法执行调用,您需要执行以下操作:
Application_Deactivated
{
thread t=new Thread(CancelCall);
thread.IsBackground=false;//make this a foreground thread
thread.Start();
}
private void CancelCall(object state)
{
Backgroundworker.RunWorkerCompleted += bw_completed;
Backgroundworker.Cancel async
Thread.Sleep(10000); wait for 10 seconds
}
值得一提的是,BackgroundWorker创建的后台线程无论如何都将被应用程序关闭,所以我不确定这样做会带来多少额外的好处。 10秒关闭不会让用户满意,他们很可能会抱怨应用程序a)慢或b)有bug。
除非某些内容正在“爆炸”并且您收到了糟糕的用户反馈或错误报告,否则我建议将其保留原样。