C# 在c中跟踪不可调度的线程中止#

C# 在c中跟踪不可调度的线程中止#,c#,multithreading,clr,abort,hresult,C#,Multithreading,Clr,Abort,Hresult,我在C#in generic try-catch块(捕获所有异常)中得到了一个ThreadAbortException——但是,我无法获得它的跟踪,这表明它可能是在托管代码之外被杀死的 我得到一个HRESULT代码-2146233040,解码时: 设施城市19-.NET CLR 代码0x1530-COR_E_线程中止 抛出到线程中以使其中止。不可捕捉 你知道如何追踪这只野兽吗?这是由一个调用引发的 请注意,即使托管代码抛出了,也无法阻止传播。你可以抓住它,但你不能忽视它 然后搜索COR_E_TH

我在C#in generic try-catch块(捕获所有异常)中得到了一个ThreadAbortException——但是,我无法获得它的跟踪,这表明它可能是在托管代码之外被杀死的

我得到一个HRESULT代码-2146233040,解码时:

设施城市19-.NET CLR

代码0x1530-COR_E_线程中止

抛出到线程中以使其中止。不可捕捉


你知道如何追踪这只野兽吗?

这是由一个调用引发的

请注意,即使托管代码抛出了,也无法阻止传播。你可以抓住它,但你不能忽视它

然后搜索
COR_E_THREADABORTED
,您将看到它用于
threadabortextException

可能有一种方法可以找到引发此异常的位置:


如果可以在Visual Studio调试器下运行此操作,请转到菜单项
Debug | Exceptions
,然后勾选“托管调试助手”旁边抛出列中的复选框。(如果愿意,可以勾选抛出列中的所有项。)然后在调试器下运行程序,查看是否弹出任何内容

这是由引发错误的调用引起的

请注意,即使托管代码抛出了,也无法阻止传播。你可以抓住它,但你不能忽视它

然后搜索
COR_E_THREADABORTED
,您将看到它用于
threadabortextException

可能有一种方法可以找到引发此异常的位置:


如果可以在Visual Studio调试器下运行此操作,请转到菜单项
Debug | Exceptions
,然后勾选“托管调试助手”旁边抛出列中的复选框。(如果愿意,可以勾选抛出列中的所有项。)然后在调试器下运行程序,查看是否弹出任何内容

但是,在阅读文档时,OP可能希望尝试在他的
finally
ThreadAbortException是一个可以捕获的特殊异常,但它将在catch块末尾自动再次引发。当引发此异常时,运行库在结束线程之前执行所有finally块。因为线程可以在finally块中执行无界计算,或者调用thread.ResetAbort来取消中止,所以不能保证线程会结束。
线程不应该中止,因为我没有调用thread.abort()。虽然我可以重置中止,但这似乎不安全,也无助于追查线程首先中止的原因。@ayu我在回答的最后一段解释了如何打开“托管调试助手”,它可以在第一次抛出这些异常时捕获这些异常。Matthew,它们都被检查过,虽然它确实捕获了它,但我仍然不知道线程从哪里中止。我从捕获的异常中得到的只是一个complus异常代码。但是,阅读文档时,OP可能想尝试在他的
finally
中放入一些内容:
ThreadAbortException是一个可以捕获的特殊异常,但它将在catch块的末尾自动再次引发。当引发此异常时,运行库在结束线程之前执行所有finally块。因为线程可以在finally块中执行无界计算,或者调用thread.ResetAbort来取消中止,所以不能保证线程会结束。
线程不应该中止,因为我没有调用thread.abort()。虽然我可以重置中止,但这似乎不安全,也无助于追查线程首先中止的原因。@ayu我在回答的最后一段解释了如何打开“托管调试助手”,它可以在第一次抛出这些异常时捕获这些异常。Matthew,它们都被检查过,虽然它确实捕获了它,但我仍然不知道线程从哪里中止。我从捕获的异常中得到的只是一个complus异常代码。