【问题标题】:AbandonedMutexException on single instance app [duplicate]单实例应用程序上的 AbandonedMutexException [重复]
【发布时间】:2013-04-26 09:04:27
【问题描述】:

我有一个 .net 3.5 / c# / wpf 应用程序,我不希望用户能够运行多个实例。所以我在我的 app.xaml.cs 中使用以下内容

protected override void OnStartup(StartupEventArgs e)
{
    const string mutexName = "Local\\MyApp.SingleInstance";
    try
    {
        // Create a new mutex object with a unique name
        _mutex = new Mutex(false, mutexName);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message + "\n\n" + ex.StackTrace +
                    "\n\n" + "Application Exiting…", "Exception thrown");
        Current.Shutdown();
    }

    if (_mutex.WaitOne(0, false))
    {
        base.OnStartup(e);
    }
    else
    {
        MessageBox.Show("app is already open", "Error", MessageBoxButton.OK, MessageBoxImage.Information);
        Current.Shutdown();
    }
    //...show mainwindow or load app
}

我的问题是我的一些用户报告了这个异常: 例外:由于放弃互斥体,等待已完成。 类型:System.Threading.AbandonedMutexException

我无法在本地重现这个,所以我很难弄清楚发生了什么。

想添加

finally
{
    _mutex.ReleaseMutex();
}

经过我的 try/catch 可能有帮助吗?

【问题讨论】:

  • 你绝对应该有一个try...finally。请参阅stackoverflow.com/q/635640/56778,尤其是问题中的第二个代码示例。
  • 谢谢,非常有帮助。这有助于解释约翰的回答。
  • 另外,需要明确的是,ReleaseMutex 应该只在应用关闭时调用。

标签: c# wpf mutex


【解决方案1】:

如何使用:

using (var mutex = new Mutex(false, mutexName))
{
    if (mutex.WaitOne(0, false))
    {
        base.OnStartup(e);
    }
    else
    {
        MessageBox.Show("app is already open", "Error", MessageBoxButton.OK, MessageBoxImage.Information);
        Current.Shutdown();
    }
}

【讨论】:

  • 感谢您的回答!根据我自己的理解,想法是:如果我使用 using 语句,互斥对象将被正确处理,我不需要担心调用 .ReleaseMutex?
  • 是的,就是这样。一般来说,如果它实现了IDisposable,则将其放入using 块中。当然,这是一种简化,但几乎是真的。
  • -1 完全错误。您必须释放互斥锁,并且必须在调用WaitOne 的同一线程上释放它; Dispose 不会 这样做。您确实应该使用 using 块,但应立即在 WaitOne 成功块内设置 try...finally,并在 finally 块中调用 ReleaseMutex。见Why doesn't Mutex get released when disposed?
  • @jnm2 - 我会相信你的话。我会删除我的答案。
猜你喜欢
  • 2012-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-16
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-04-24
相关资源
最近更新 更多