Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 615
Damian Avatar asked Aug 11 '11 18:08

Damian


2 Answers

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

like image 115
Skomski Avatar answered Sep 26 '22 21:09

Skomski


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/

like image 34
Abhishek Avatar answered Sep 25 '22 21:09

Abhishek