/// <summary>
/// 检查是否有其他实例正在运行
/// </summary>
/// <returns>如果找到其他运行实例则返回该进程,否则返回null</returns>
public static Process RunningInstance()
{
// 获取当前进程信息
Process current = System.Diagnostics.Process.GetCurrentProcess();
// 获取系统中所有正在运行的进程
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
// 遍历所有进程,查找相同名称的进程
foreach (System.Diagnostics.Process process in processes) //查找相同名称的进程
{
// 排除当前进程本身
if (process.Id != current.Id) //忽略当前进程
{
// 检查进程名称是否与当前进程名称相同
if (process.ProcessName == current.ProcessName)//判断进程名称是否和当前运行进程名称一样
{
// 进一步验证:检查可执行文件路径是否相同(确保是同一个程序的不同实例)
if (Assembly.GetExecutingAssembly().Location.Replace(@"/", @"\") == current.MainModule.FileName)
{
// 找到其他运行实例,返回该进程对象
return process;
}
}
}
}
// 没有找到其他运行实例,返回null
return null;
}
/// <summary>
/// 处理应用程序未捕获的异常
/// </summary>
/// <param name="sender">事件源</param>
/// <param name="e">异常事件参数</param>
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// 定义异常信息字符串
string str;
// 获取未处理的异常对象
var error = e.Exception;
if (error != null)
{
// 如果有异常对象,格式化异常信息和堆栈信息
str = string.Format("出现应用程序未处理的异常----->" + "Application UnhandledException:{0};\n\r堆栈信息:{1}", error.Message, error.StackTrace);
}
else
{
// 如果没有异常对象,仅记录事件信息
str = string.Format("Application UnhandledError:{0}", e);
}
// 可选:写入系统错误日志(已注释)
//SystemError.WriteAlarmLog(str);
// 弹出消息框提示用户发生错误,并显示异常信息
System.Windows.MessageBox.Show("发生错误,请查看程序日志!" + Environment.NewLine + str, "系统错误", MessageBoxButton.OK, MessageBoxImage.Error);
// 标记异常已处理,防止程序崩溃
e.Handled = true;
}
关于System.Diagnostics.Process.GetCurrentProcess()的介绍如下
返回的 Process
对象包含哪些信息?
这个 Process
对象提供了许多属性和方法,可以获取当前进程的详细信息,例如:
-
Id
(进程 ID,int
类型,唯一标识该进程) -
ProcessName
(进程名称,如"MyApp"
) -
MainModule
(主模块信息,通常是可执行文件.exe
的路径) -
StartTime
(进程启动时间) -
Threads
(该进程的所有线程集合) -
Handle
(进程的 Windows 句柄) -
PriorityClass
(进程优先级) -
WorkingSet64
(进程占用的物理内存大小,单位:字节)
其中DispatcherUnhandledExceptionEventArgs
用于处理 应用程序级别未捕获的异常
DispatcherUnhandledExceptionEventArgs
的作用是:
-
捕获 WPF 应用程序中未处理的异常(如 UI 线程抛出的异常)。
-
决定是否终止应用程序(通过
e.Handled
属性)。 -
记录错误信息或显示友好错误提示(避免程序直接崩溃)
在 protected override void OnStartup(StartupEventArgs e)方法中如下使用
// 注册未处理异常事件
this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);
this.DispatcherUnhandledException
是什么?
-
类型:
Application.DispatcherUnhandledException
事件(属于System.Windows.Application
类)。 -
触发时机:当 WPF 应用程序的 UI 线程(Dispatcher 线程)抛出未捕获的异常时触发。
-
默认行为:如果不处理此事件,WPF 应用程序会崩溃并显示错误对话框。