【发布时间】:2023-03-04 13:52:01
【问题描述】:
我在 Windows Phone 7 上的 Application_Deactivated 事件中取消后台工作程序时遇到了一点问题。
我的后台工作人员正在与网络服务同步,但由于我无法猜测需要多长时间,我只想取消工作人员。这样做的问题是,在事件处理程序完成后,应用程序只会杀死所有线程,所以我无法正确取消它。
我想做的是这样的:
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 响应的空引用的错误。
我已经在后台工作人员中检查取消挂起,并且取消功能已经使用取消按钮进行了测试,所以这不是问题。纯粹是我需要等到后台工作人员正确退出。
我在这个网站上发现了一些类似这样的结果: How close BackgroundWorker thread when application is deactivated?
但这仅给出了 ThreadAbortException 的解决方案,但我宁愿不使用这个。
如果您需要更多代码,我可以提供。
【问题讨论】:
-
你想创建一个超时函数吗?
-
不,我正在尝试等待应用程序进入休眠状态,直到我的后台线程因异常异常或错误而被取消。我有 10 秒的等待时间,但我找不到在不让整个应用程序挂起的情况下申请这个时间的方法。
-
How close BackgroundWorker thread when application is deactivated? 的可能副本。这个问题的答案提到您可以在工作线程中回复
CancellationPending- 只有在您不回复的情况下才会抛出ThreadAbortException。 -
当应用程序关闭时,您真的看到任何问题或错误吗?当应用程序被停用或关闭时,WP7 的默认性质是关闭所有 cpu 活动(包括后台线程和 Web 套接字)并被框架终止,你没有看到这个吗?您是否还有其他原因试图取消/暂停后台工作人员,或者您只是想彻底关闭它?
标签: c# windows-phone-7