【发布时间】: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应该只在应用关闭时调用。