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

时间:2012-01-18 14:04:39

标签: c# windows-phone-7

我在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的解决方案,但我宁愿不使用这个。

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

1 个答案:

答案 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。

除非某些内容正在“爆炸”并且您收到了糟糕的用户反馈或错误报告,否则我建议将其保留原样。