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,以及静态方法OpenExistingTryOpenExisting,但都没有成功。

Mutex and Windows Phone 8.1 Silverlight

您没有在主应用程序中锁定互斥对象,您只是创建了它(也没有所有权)。您可以创建具有初始所有权的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
}

此外,我不认为在应用程序关闭之前持有互斥锁是一种很好的做法——只有在真正需要的时候才锁定互斥锁(例如访问公共文件)。如果您真的想尝试这样做,请在启动时创建一个全局互斥实例,然后在关闭时释放它,但不需要再次获取,只需使用前一个实例即可。

注意几件事——不要留下被遗弃的互斥体,注意这样它就不会被垃圾收集,在需要时释放它。有很多关于这个同步对象的帖子,这里有一个很好的模式。