一、保证只有一个进程
1.1 关闭旧的,打开新的
csharp
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
var process =Process.GetProcessesByName("Dog");
if (process.Count() > 1) {
var list = process.ToList();
list.Sort((p1,p2)=>p1.StartTime.CompareTo(p2.StartTime));
list[0].Kill();
}
}
1.2 程序打开后不再打开新程序
csharp
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
var process =Process.GetProcessesByName("Dog");
if (process.Count() > 1) {
MessageBox.Show("已经打开一个程序");
Process.GetCurrentProcess().Kill();
}
}
二、异常捕捉
csharp
public App()
{
//注册全局事件
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
DispatcherUnhandledException += App_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
}
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs args)
{
const string msg = "主线程异常";
try
{
if (args.ExceptionObject is Exception && Dispatcher != null)
{
Dispatcher.Invoke(() =>
{
Exception ex = (Exception)args.ExceptionObject;
HandleException(msg, ex);
});
}
}
catch (Exception ex)
{
HandleException(msg, ex);
}
}
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs args)
{
const string msg = "子线程异常";
try
{
HandleException(msg, args.Exception);
args.Handled = true;
}
catch (Exception ex)
{
HandleException(msg, ex);
}
}
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs args)
{
const string msg = "异步异常";
try
{
HandleException(msg, args.Exception);
args.SetObserved();
}
catch (Exception ex)
{
HandleException(msg, ex);
}
}
private void HandleException(string msg, Exception ex)
{
MessageBox.Show(ex.Message,msg);
}