正在取消application_deactivated事件WP7的后台工作程序

本文关键字:WP7 后台 工作程序 事件 deactivated 取消 application | 更新日期: 2023-09-27 18:20:34

我在Windows Phone 7上的Application_Dactivated事件中取消后台工作人员时遇到了一点问题。

我的后台工作人员正在与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线程是应用程序的主线程,在该线程中等待会阻塞整个应用程序。

在事件处理程序中调用cancelAsync后,应用程序将进入休眠状态,并且在恢复实际后台工作程序中调用的web处理程序时,将给出一个关于对web响应的空引用的错误。

我已经在后台工作人员中检查取消挂起,并且取消功能已经用取消按钮进行了测试,所以这不是问题所在。这纯粹是因为我需要等待后台工作人员正确退出。

我在这个网站上发现了一些结果,如下所示:应用程序停用时BackgroundWorker线程的关闭程度如何?

但这只提供了一个ThreadAbortException的解决方案,但我宁愿不使用这个。

如果你需要更多的代码,我可以提供。

正在取消application_deactivated事件WP7的后台工作程序

您的线程被关闭,因为它们是后台线程。当一个应用程序关闭时,所有后台线程都会关闭,对此你无能为力。

您可以创建前台线程。该应用程序不会/不能终止前台线程,并且将一直运行到前台线程终止。

要使用此方法执行调用,您需要执行以下操作:

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)有漏洞。

除非有什么东西正在"爆炸",并且你收到了糟糕的用户反馈或错误报告,否则我建议保持原样。