要在 WPF 应用程序中实现单例模式,确保应用程序在任意时刻只有一个实例运行,您可以在 App.xaml.cs
的 OnStartup
方法中检查是否已有应用程序实例在运行。如果是,那么可以阻止新实例的启动,并将焦点转移到现有实例,或者直接退出新实例。
以下是如何实现这种单例行为的代码示例:
检查已运行的实例: 使用 Mutex
来检查是否已有实例在运行。
处理已存在的实例: 如果发现已有实例在运行,可以将用户的注意力转移到那个实例上,或者简单地退出当前的实例。
首先,需要在 App.xaml.cs
中添加适当的代码:
using System;
using System.Threading;
using System.Windows;
namespace App
{
public partial class App : Application
{
private static readonly ILog log = LogManager.GetLogger(typeof(App));
private static Mutex mutex = null;
protected override void OnStartup(StartupEventArgs e)
{
const string appName = "App";
bool createdNew;
mutex = new Mutex(true, appName, out createdNew);
if (!createdNew)
{
// 应用程序的另一个实例已经在运行
MessageBox.Show("应用程序已在运行。");
Current.Shutdown(); // 关闭当前实例
return;
}
base.OnStartup(e);
// 其他启动逻辑
}
// 其他方法...
}
}
在这段代码中:
appName
的 Mutex
被创建。如果它是新创建的 (createdNew
为 true
),说明当前没有运行该应用程序的其他实例。createdNew
为 false
,则表示已有另一个实例在运行。在这种情况下,程序会显示一条消息并关闭当前实例。请注意,这种方法在多数常见场景下有效,但它并不处理跨用户会话的实例检测。如果您的应用程序需要在多用户环境中运行,并且需要考虑每个用户会话,那么可能需要更复杂的逻辑来管理应用程序实例。