How to signal a ScheduledTask from a foreground app on Windows Phone?

假装没事ソ 提交于 2019-12-18 16:58:25

问题


I'm creating an app that has a foreground app (of course) and both a PeriodicTask and a ResourceIntensiveTask.

I need a way to shutdown the scheduled tasks if the user launches the app itself while they are running.

I don't see any way of doing this with system-wide Mutexes. Ideally when the background tasks started, a thread would be spun off that listens for a signal from the foreground app, and if it receives this signal it can shutdown the background task cleanly.

Other than polling (say a folder for a specific file), does anyone have a clean suggestion on how my foreground app can signal my background agents to close down if the foreground app is launched?

I'm heading towards sockets, but this seems like overkill.

Background: I'm currently using IsolatedStorage to store my data (not a database) - eventually I'll move to using a database.

My foreground app synchronizes local data with a web service, and updates the UI when new items get added from the web service. I use a file which I seek through to find data items, and which I append to as new items get synced.

I want background agents to run to perform this synchronization in the background, updating the files in isolated storage, including indexes, etc. But as soon as I start up the foreground app, I need the background app to stop, so that the foreground and background don't both try to update the same files at the same time.

I need only one process to update the local data at a time, and I need the foreground process to preempt the background process.


回答1:


No concurrent update solution:

Application (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 (Main thread) :

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)
}

Stop PeriodicTask when Application starts solution:

Application (App()) :

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

// Application    

m.ReleaseMutex();

PeriodicTask (Separate thread) :

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

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

// Abort task

I think thats the best solution with the available members in WP7:

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




回答2:


You can use Interprocess communication via Named Events.

You can signal your background agent as soon as you open your foreground app.

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



来源:https://stackoverflow.com/questions/7030715/how-to-signal-a-scheduledtask-from-a-foreground-app-on-windows-phone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!