但根据上文这样会把已经打开的程序全部关闭
时间: 2024-03-01 13:55:13 浏览: 55
很抱歉给您带来困扰,确实上文的示例代码有误,会将所有已经打开的程序全部关闭。以下是一个更新后的示例代码,可以正确地实现单例模式,同时在关闭第二个实例时只关闭第二个实例本身,而不是将所有实例全部关闭:
```csharp
public partial class App : Application
{
private static Mutex mutex = new Mutex(true, "MyApplicationName");
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
if (!mutex.WaitOne(TimeSpan.Zero, true))
{
MessageBox.Show("程序已经在运行中!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
Current.Shutdown();
return;
}
MainWindow mainWindow = new MainWindow();
mainWindow.Show();
}
protected override void OnExit(ExitEventArgs e)
{
mutex.ReleaseMutex();
base.OnExit(e);
}
}
```
在这个示例代码中,我们使用了一个名为 mutex 的 Mutex 对象来实现单例模式。在 OnStartup 函数中,我们首先尝试通过 mutex.WaitOne 来尝试获取 mutex 对象的所有权。如果获取成功,则说明程序尚未运行,我们创建并显示主窗体;如果获取失败,则说明程序已经在运行中,我们弹出提示信息并关闭当前实例。
同时,在 OnExit 函数中,我们通过 mutex.ReleaseMutex 来释放 mutex 对象的所有权,以便其他实例可以继续获取它。这样,我们就可以正确地实现单例模式,而且在关闭第二个实例时只关闭第二个实例本身,而不是将所有实例全部关闭。
阅读全文