【问题标题】:Cancelling backgroundworker on application_deactivated event WP7在 application_deactivated 事件 WP7 上取消后台工作程序
【发布时间】: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


【解决方案1】:

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

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

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

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

除非某些事情正在积极“爆炸”并且您收到糟糕的用户反馈或错误报告,否则我建议保持原样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多