Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单实例应用程序上的放弃MutexException_C#_Wpf_Mutex - Fatal编程技术网

C# 单实例应用程序上的放弃MutexException

C# 单实例应用程序上的放弃MutexException,c#,wpf,mutex,C#,Wpf,Mutex,我有一个.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 nam

我有一个.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.ForwardedMutexException

我不能在本地复制,所以我很难弄清楚到底发生了什么

会添加

finally
{
    _mutex.ReleaseMutex();
}
在我尝试/捕获后,可能会有帮助吗?

使用以下方法如何:

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
,则使用
块将其放入
。这当然是一种简化,但几乎是正确的。-1完全错了。您必须释放互斥锁,并且必须在调用
WaitOne
的同一线程上释放互斥锁<代码>处置
不执行此操作。您确实应该使用using块,但是在
WaitOne
success块的内部,
try…finally
应该设置为
ReleaseMutex
,在
finally
块中调用。见@jnm2-我相信你的话。我将删除我的答案。你肯定应该有一个
尝试…最后
。请参阅,特别是问题中的第二个代码示例。谢谢,非常有用。这有助于解释John的答案。另外,需要明确的是,
ReleaseMutex
只应在应用程序关闭时调用。