gpt4 book ai didi

c# - Try/Catch 和线程

转载 作者:可可西里 更新时间:2023-11-01 08:01:39 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com