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.
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
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/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With