互斥和 Windows Phone 8.1 Silverlight

Mutex and Windows Phone 8.1 Silverlight

如果应用程序在前台打开,我想阻止我的后台进程执行操作。我发现 here 提出了类似的问题,但我无法让它为我工作。当我的后台进程检查 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); 
}

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

您没有在主应用程序中锁定您的互斥锁,您只是创建它(也没有所有权)。您可以创建具有初始所有权的 Mutex 或在需要时调用 WaitOne()。更多帮助 at Joe Alabhari's blog.

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

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

注意几件事 - 不要留下废弃的互斥量,注意不要将其作为垃圾回收,在需要时释放它。关于这个同步对象的帖子很多,here you have a good pattern