📜  c# 线程中未处理的异常 - C# (1)

📅  最后修改于: 2023-12-03 15:29:48.076000             🧑  作者: Mango

C# 线程中未处理的异常

在 C# 中,当线程抛出未处理的异常时,程序可能会崩溃或出现其他问题。本文将介绍如何处理线程中未处理的异常,并提供一些常见的解决方法。

1. 线程异常处理
1.1 try-catch 块

在 C# 中捕获线程异常最简单的方法是使用 try-catch 块,如下所示:

try
{
    Thread t = new Thread(new ThreadStart(DoWork));
    t.Start();
}
catch (Exception ex)
{
    Console.WriteLine("Caught exception: " + ex.Message);
}
1.2 AppDomain.UnhandledException 事件处理程序

C# 提供了 AppDomain.UnhandledException 事件,它可以处理未被 catch 的线程异常。当发生未处理的异常时,C# 运行时会调用 AppDomain.UnhandledException 事件处理程序。示例代码如下:

static void Main(string[] args)
{
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);

    Thread t = new Thread(new ThreadStart(DoWork));
    t.Start();
}

static void MyHandler(object sender, UnhandledExceptionEventArgs args)
{
    Exception e = (Exception)args.ExceptionObject;
    Console.WriteLine("MyHandler caught : " + e.Message);
}
2. 常见问题的解决方法
2.1 确保线程会完全退出

如果您的线程没有正确退出,可能会导致未处理的异常。您可以使用 Thread.Join 方法等待线程完全退出,然后再执行其他代码。示例代码如下:

Thread t = new Thread(new ThreadStart(DoWork));
t.Start();

t.Join(); // 等待线程执行完毕
2.2 使用 Task-based 异步模式

在 C# 5 中引入的 Task-based 异步模式可以减少线程异常的发生。如果使用该模式,您可以使用 Task.Exception 属性处理任何未处理的异常。示例代码如下:

async Task DoWorkAsync()
{
    // 业务逻辑

    throw new Exception("Something went wrong...");
}

try
{
    await DoWorkAsync();
}
catch (Exception ex)
{
    Console.WriteLine("Caught exception: " + ex.Message);
}
3. 小结

本文介绍了 C# 中如何处理线程中未处理的异常,并提供了一些常见的解决方法。通过使用这些方法,您可以避免因未处理的异常而导致的程序崩溃和其他问题。