【问题标题】:How to signal a ScheduledTask from a foreground app on Windows Phone?如何从 Windows Phone 上的前台应用程序发出 ScheduledTask 信号?
【发布时间】:2011-08-11 18:07:14
【问题描述】:

我正在创建一个具有前台应用程序(当然)以及 PeriodicTask 和 ResourceIntensiveTask 的应用程序。

如果用户在运行时自行启动应用程序,我需要一种方法来关闭计划任务。

我没有看到任何使用系统范围互斥锁的方法。理想情况下,当后台任务启动时,会分离出一个线程来侦听来自前台应用程序的信号,如果它收到此信号,它就可以干净地关闭后台任务。

除了轮询(比如特定文件的文件夹)之外,是否有人对我的前台应用程序如何在前台应用程序启动时向我的后台代理发出关闭信号有明确的建议?

我正朝着套接字方向前进,但这似乎有点矫枉过正。

背景: 我目前正在使用 IsolatedStorage 来存储我的数据(不是数据库)——最终我将转向使用数据库。

我的前台应用将本地数据与 Web 服务同步,并在从 Web 服务添加新项目时更新 UI。我使用一个文件来查找数据项,并在新项目同步时附加到该文件中。

我希望后台代理运行以在后台执行此同步,更新隔离存储中的文件,包括索引等。但是一旦我启动前台应用程序,我需要停止后台应用程序,以便前台和后台不会同时尝试更新相同的文件。

我只需要一个进程一次更新本地数据,我需要前台进程抢占后台进程。

【问题讨论】:

  • 我会推动将您的代理设计为能够与应用程序同时运行。如果你有一个很好的例子,这意味着这是不可能的,那么我很想听听。
  • 我添加了一些背景信息。本质上我不能让两个进程同时修改同一个文件,我希望前台进程抢占后台进程。

标签: windows-phone-7 mutex


【解决方案1】:

无并发更新解决方案:

申请(App()):

var m = new Mutex(false, "MyMutex");
m.WaitOne(); //When PeriodicTask runs wait

if(lastSynchronization > 1.Minutes)
{  
  //Update only when your PeriodicTask not runs before 
}

//ApplicationExit      
m.ReleaseMutex();

PeriodicTask(主线程):

var m = new Mutex(false, "MyMutex");
if(m.WaitOne(0)) // Dont wait for the handle
{
  // Synchronization

  m.ReleaseMutex(); 
}
else
{
  //Abort task (You dont want to wait for the main application)
}

应用启动时停止 PeriodicTask 解决方案:

应用程序(App()):

var m = new Mutex(false, "MyMutex");
m.WaitOne();

// Application    

m.ReleaseMutex();

PeriodicTask(独立线程):

var m = new Mutex(false, "MyMutex");

while (m.WaitOne(0)) // Check for main application
{
   m.ReleaseMutex(); 
}

// Abort task

我认为这是 WP7 中可用成员的最佳解决方案:

http://msdn.microsoft.com/en-us/library/system.threading.mutex(v=VS.96).aspx

【讨论】:

  • 我希望我的前台应用程序向我的周期性任务发出信号 - 周期性任务可能已经在运行。使用互斥锁实现互斥很简单,但是信号...我不太确定。
  • 当您的应用程序启动时,它将获取句柄,然后您的 PeriodicTask 无法再获取句柄并离开 while 循环。清除吗?
  • 所以你有一个紧密的循环不断地获取锁并释放它?这会吃cpu,不是吗?
  • :-) 我希望有一个更优雅的进程间信号机制——我怀疑它要么是这个,要么是套接字。如果可能的话,我真的很想避免轮询。
【解决方案2】:

您可以通过命名事件使用进程间通信。

您可以在打开前台应用后立即向后台代理发送信号。

http://blogs.windows.com/buildingapps/2013/03/27/using-named-events-to-coordinate-foreground-apps-and-background-agents/

【讨论】:

  • 谢谢 - 当我最初提出这个问题时,AFAIK 不可用,但现在很高兴知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多