Windows phone 7 如何在Windows Phone上从前台应用发送ScheduledTask信号?

Windows phone 7 如何在Windows Phone上从前台应用发送ScheduledTask信号?,windows-phone-7,mutex,Windows Phone 7,Mutex,我正在创建一个应用程序,它有一个前台应用程序(当然)和一个PeriodictTask和一个ResourceIntensiveTask 如果用户在运行应用程序时启动应用程序,我需要一种关闭计划任务的方法 我看不出有任何方法可以用系统范围的互斥来实现这一点。理想情况下,当后台任务启动时,会分离一个线程来侦听来自前台应用程序的信号,如果它接收到该信号,则可以干净地关闭后台任务 除了轮询(比如一个特定文件的文件夹)之外,是否有人对我的前台应用程序如何在前台应用程序启动时发出关闭后台代理的信号有明确的建议

我正在创建一个应用程序,它有一个前台应用程序(当然)和一个PeriodictTask和一个ResourceIntensiveTask

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

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

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

我正朝着插座走去,但这似乎太过分了

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

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

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


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

无并发更新解决方案:

应用程序(
App()
):

PeriodictTask(主线程):

停止周期问应用程序何时启动解决方案:

应用程序(
App()
):

PeriodictTask(独立线程):

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


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

你可以在打开前台应用程序后立即向后台代理发送信号


我希望我的前台应用程序向我的定期任务发送信号-定期任务可能已经在运行。通过互斥实现互斥很简单,但信号传递。。。我不太确定。当应用程序启动时,它将获取句柄,然后PeriodicTask将无法再获取句柄,并将离开while循环。明白了吗?所以你有一个紧密的循环不断地获取锁并释放它?这会消耗cpu,不是吗?:-)我希望有一个更优雅的进程间信号机制-我怀疑它会是这个,或者是套接字。如果可能的话,我真的希望避免轮询。我会推动设计您的代理,使其能够与应用程序同时运行。如果你有一个很好的例子,这意味着这是不可能的,那么我很想听听。我已经添加了一些背景信息。从本质上说,我不能让两个进程同时修改同一个文件,我希望前台进程抢占后台进程。谢谢-好吧,我最初问这个问题时没有,但现在很高兴知道。
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();
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)
}
var m = new Mutex(false, "MyMutex");
m.WaitOne();

// Application    

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

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

// Abort task