c# - Try/Catch 和线程

标签 c# multithreading try-catch

我知道为什么,但我想问一下是否有人很好地理解为什么线程内引发的异常从未被启动它的代码捕获。下面是一些非常简单的代码来演示我的意思:

using System;
using System.Collections.Generic;
using System.Threading;

namespace TestCrash
{
    class Program
    {
        private static void Crash(object control)
        {
            AutoResetEvent are = (AutoResetEvent)(((object[])control)[0]);
            are.Set();
            throw new Exception("Burn baby burn");
        }
        static void Main(string[] args)
        {
            try
            {
                List<WaitHandle> waitHandles = new List<WaitHandle>();
                for (int i = 0; i < 100; i++)
                {
                    AutoResetEvent are = new AutoResetEvent(false);
                    waitHandles.Add(are);
                    object[] procControl = new object[] { are };
                    ThreadPool.QueueUserWorkItem(Crash, procControl);
                    WaitHandle.WaitAll(waitHandles.ToArray());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }
}

我天真地认为通过 try/catch 我会很安全,但我发现事实并非如此(它正在崩溃我的一项服务)。

最佳答案

一般来说,在新线程中抛出异常时,您不知道原始线程在哪里 - 为什么它会等待线程抛出异常?

想想所涉及的堆栈 - 当异常被抛出时,它会在堆栈中上升,直到它到达适当的 catch block 。新线程与创建线程有一个完全独立的堆栈,因此它永远不会到达创建线程堆栈中的 catch block 。

编辑:当然,您可以设计您的系统,以便创建线程确实等待其他事情发生——有点像 Windows 窗体应用程序中的消息循环。然后新线程可以捕获异常并向创建线程发送消息,然后创建线程可以处理异常。但这不是正常设置 - 您必须明确地完成所有操作。

关于c# - Try/Catch 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/778437/

相关文章:

c# - 解析日期时间时出错

java - Android socket.close() 导致 "the system call was canceled"?

c++ - 图像处理中的并发设计

c++ - 异常c++中的堆栈展开

c# - 赢得表格制图

c# - 以编程方式触发 ASP.NET 控件事件的正确方法是什么?

c# - 从 C# 类创建序列化 JSON 列表类型对象

c - 多线程,每个线程都有唯一的变量

java - 找到正确的异常来捕获

javascript - Try and catch 对输入进行校验和验证,以检查 Javascript 中输入的三个部分