我正在创建一个具有前台应用程序(当然)以及PeriodicTask和ResourceIntensiveTask的应用程序。
如果用户在运行时自行启动应用程序,我需要一种关闭计划任务的方法。
我认为没有任何方法可以使用系统范围的互斥锁。理想情况下,当后台任务开始时,一个线程将被旋转,以侦听来自前台应用程序的信号,如果它收到此信号,它可以干净地关闭后台任务。
除了轮询(比如某个特定文件的文件夹)之外,是否有人对我的前台应用程序如何通知我的后台代理在前台应用程序启动时关闭时有一个干净的建议?
我正朝着插座走去,但这似乎有些过分。
背景 我目前正在使用IsolatedStorage来存储我的数据(而不是数据库) - 最终我将转向使用数据库。
我的前台应用程序将本地数据与Web服务同步,并在从Web服务添加新项目时更新UI。我使用我搜索的文件来查找数据项,并在新项目同步后附加到该文件中。
我希望运行后台代理以在后台执行此同步,更新隔离存储中的文件,包括索引等。但是当我启动前台应用程序时,我需要停止后台应用程序,以便前台和后台都不会同时尝试更新相同的文件。
我一次只需要一个进程来更新本地数据,我需要前台进程来抢占后台进程。
答案 0 :(得分:5)
没有并发更新解决方案:
应用程序(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
答案 1 :(得分:3)
您可以通过命名事件使用进程间通信。
您可以在打开前台应用时立即向后台代理发出信号。