关于c#:Mutex和Windows Phone 8.1 Silverlight

Mutex and Windows Phone 8.1 Silverlight

如果应用在前台打开,我想阻止后台进程执行操作。我在这里发现了类似的问题,但是我无法解决它。当我的后台进程检查互斥对象时,它从来就不存在。当前台应用启动时,我将创建一个互斥体,如下所示:

1
2
3
4
public void Application_Launching(object sender, LaunchingEventArgs e)
{
    var myMutex = new Mutex(false,"MUTEX_NAME");
}

我在前台应用关闭时释放它:

1
2
3
4
5
private void Application_Closing(object sender, ClosingEventArgs e)
{
    var myMutex = new Mutex(false,"MUTEX_NAME");
    myMutex.ReleaseMutex();
}

在后台进程中,我进行了以下检查:

1
2
3
4
5
bool IsMutexLocked()
{
    var myMutex = new Mutex(false,"MUTEX_NAME");
    return myMutex.WaitOne(100);
}

我在这里假设WaitOne如果"MUTEX_NAME"不存在或者确实存在但在100ms后被释放,则返回true。我还尝试过在Mutex构造函数中使用out createdNew,以及静态方法OpenExistingTryOpenExisting,但无济于事。


您并未将互斥锁锁定在主应用程序中,而只是创建了互斥锁(也没有所有权)。您可以创建具有初始所有权的Mutex,也可以在需要时调用WaitOne()。 Joe Alabhari的博客提供了更多帮助。

1
2
3
4
5
public void Application_Launching(object sender, LaunchingEventArgs e)
{
    var myMutex = new Mutex(true,"MUTEX_NAME");
    // or call myMutex.WaitOne() // here maybe some timeout handling
}

我也不认为在关闭应用程序之前保持互斥锁不是一个好习惯-仅在确实需要时(例如,访问公用文件)锁定互斥锁。如果您真的想尝试此操作,请在启动时创建一个全局互斥体实例,然后在关闭时释放它,但是无需再次获取它,只需使用以前的实例即可。

请注意一些事情-不要留下废弃的互斥锁,请注意不要被垃圾回收,需要时将其释放。关于此同步对象的文章很多,这里有一个很好的模式。