【问题标题】:Controlling background task instances控制后台任务实例
【发布时间】:2015-12-04 21:53:56
【问题描述】:

有没有办法同步一个后台任务的多个实例?

我正在开发一个通用 Windows 8.1 商店项目。我有一个后台任务接收原始通知和下载并更新一些数据(希望满足 CPU 配额和运行时间限制)。

当多个推送同时到达时,我想避免在 Windows Phone 上同时运行后台工作。也就是说,后台任务应该检查它的另一个实例是否正在运行并安静地退出。

我能想到的唯一方法是通过本地存储中的信号量文件......但由于 WP 上的所有文件 IO 都是异步的,我不知道如何在没有竞争条件的情况下让它工作。

有什么想法吗?

【问题讨论】:

  • 您是只询问 WP8.1 还是 W10? - 你标记了uwp,它代表 W10。
  • 嗯,他们曾经将其称为适用于 Windows 8.1 的 Universal Store Application。好的,我会删除标签。

标签: windows-runtime windows-phone-8.1 windows-store-apps synchronization windows-8.1-universal


【解决方案1】:

存在用于跨进程同步的对象,使用它们比使用文件发出信号要好得多。您可能会想到使用带有名称的EventWaithHandleMutex 进行全局同步。它可以在多个进程(不仅是线程)之间工作。这个同步的一个很好的例子你可以找到at Alabhari's blog

在您的情况下,如果设置了句柄,则意味着其他进程如果正在执行工作并且当前进程可以返回。

关于等待句柄,您可以在this question 找到更多信息。

【讨论】:

  • 谢谢!不知道 EventWaithHandle 在进程之间工作。但是有一个问题:如果操作系统在有机会发出信号之前杀死了锁定 EventWaithHandle 的进程会发生什么?
  • 所以,要使用这种技术,我执行以下操作:bool createNew; var handle = new EventWaitHandle(false, EventResetMode.ManualReset, "bglock", out createNew);;如果 createNew 标志上升,那么我刚刚锁定了“bglock”系统事件,否则其他进程目前正在持有它,我应该退出。我做对了吗?
  • 这种方法是否需要我在工作完成后处理 EventWaitHandle?这可能根本不会发生,因为操作系统可能会在任何时候杀死我的进程,甚至不会向我触发事件或其他东西。对于文件,我至少可以检查信号量文件的创建时间以检测过时的锁。
  • @NoxNoctis 请注意,当操作系统取消您的 BTask 时,它会收到 Cancelled 事件和 Completed 事件 - 您应该处理这种情况。至于模式,您可以在这里查看good mutex pattern - 在您的情况下它可能会被简化,但应该是一个好的开始。基本上就像我想的那样,你创建一个全局对象然后运行 ​​bool hasHandle = obj.WaitHandle(0) 如果有句柄然后执行一些工作并在完成后释放互斥锁。可能存在一些陷阱 - 请记住,同步对象必须由获取它的同一线程返回。
  • 引用说“如果没有出现内存不足异常,或者应用程序没有处理它,那么后台任务将在没有警告且不会引发 OnCanceled 事件的情况下终止。”
猜你喜欢
  • 1970-01-01
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多