单实例应用的AbandonedMutexException

本文关键字:应用 AbandonedMutexException 实例 单实例 | 更新日期: 2023-09-27 18:11:01

我有一个。net 3.5/c#/wpf应用程序,我不希望用户能够运行多个实例。所以我在app. example .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();
}

在我尝试/抓住可能帮助吗?

单实例应用的AbandonedMutexException

使用:

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();
    }
}