2012-01-18 60 views
1

我有一个问题的一点点带有取消我的背景工人在Application_Deactivated事件在Windows Phone 7上application_deactivated事件取消BackgroundWorker的WP7

我的后台工作与网络服务同步,但我可以我猜猜它要走多久了,我只想取消工人。与此问题是,事件处理程序完成后,应用程序将只会杀死所有线程,所以我不能正确取消它。

我想什么做的是这样的:

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响应网络处理程序时。

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

我发现本网站上像这样的一些成果: How close BackgroundWorker thread when application is deactivated?

但是,只给了一个解决方案与ThreadAbortException,但我宁可不使用这一个。

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

+0

你想创建一个超时功能吗? – 2012-01-18 14:10:25

+0

不,我试图等待应用程序进入休眠状态,直到我的后台线程被取消了隐藏或错误。我有10秒钟等待,但我无法找到一种方法来声明这一次,而不让整个应用程序挂起。 – arjanhgroen 2012-01-18 14:16:16

+0

[应用程序停用时如何关闭BackgroundWorker线程?](http://stackoverflow.com/questions/7620098/how-close-backgroundworker-thread-when-application-is-deactivated)。这个问题的答案提到你可以在你的工作线程中响应'CancellationPending' - 只有在你不这样做的时候''ThreadAbortException''才会被抛出。 – 2012-01-19 07:39:14

回答

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)有错误。

除非有什么积极的“爆炸”,并且您的用户反馈或错误报告不好,否则我建议您保持原样。