Mutex and Windows Phone 8.1 Silverlight
本文关键字:Silverlight Phone and Windows Mutex | 更新日期: 2023-09-27 18:20:58
如果应用程序在前台打开,我想阻止后台进程执行操作。我在这里发现了一个类似的问题,但我无法让它为我工作。当我的后台进程检查Mutex时,它从未存在过。当前台应用程序启动时,我会创建一个Mutex,就像这样:
public void Application_Launching(object sender, LaunchingEventArgs e)
{
var myMutex = new Mutex(false, "MUTEX_NAME");
}
我在前台应用程序关闭时发布它:
private void Application_Closing(object sender, ClosingEventArgs e)
{
var myMutex = new Mutex(false, "MUTEX_NAME");
myMutex.ReleaseMutex();
}
在后台过程中,我进行了以下检查:
bool IsMutexLocked()
{
var myMutex = new Mutex(false, "MUTEX_NAME");
return myMutex.WaitOne(100);
}
我在这里假设,如果"MUTEX_NAME"
不存在,或者它确实存在,但在100ms后释放,则WaitOne
返回true。我还尝试过在Mutex构造函数中使用out createdNew
,以及静态方法OpenExisting
和TryOpenExisting
,但都没有成功。
您没有在主应用程序中锁定互斥对象,您只是创建了它(也没有所有权)。您可以创建具有初始所有权的Mutex,也可以在需要时调用WaitOne()。Joe Alabhari的博客提供了更多帮助。
public void Application_Launching(object sender, LaunchingEventArgs e)
{
var myMutex = new Mutex(true, "MUTEX_NAME");
// or call myMutex.WaitOne() // here maybe some timeout handling
}
此外,我不认为在应用程序关闭之前持有互斥锁是一种很好的做法——只有在真正需要的时候才锁定互斥锁(例如访问公共文件)。如果您真的想尝试这样做,请在启动时创建一个全局互斥实例,然后在关闭时释放它,但不需要再次获取,只需使用前一个实例即可。
注意几件事——不要留下被遗弃的互斥体,注意这样它就不会被垃圾收集,在需要时释放它。有很多关于这个同步对象的帖子,这里有一个很好的模式。