gpt4 book ai didi

.net - 来自 BackgroundWorker_RunWorkerCompleted 的 TargetInvocationException

转载 作者:行者123 更新时间:2023-12-02 00:21:22 24 4
gpt4 key购买 nike

假设有以下情况。表单有一个按钮,单击该按钮可启动后台工作程序。在 RunWorkerCompleted 事件处理程序中,有一段代码会抛出未经处理的异常。表单从 Application.Run 方法启动。

public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}

private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
throw new Exception();
}

private void button_Click(object sender, EventArgs e)
{
backgroundWorker.RunWorkerAsync();
}
}

问题是 Visual Studio 在 Application.Run 调用而不是在 FormMain.backgroundWorker_RunWorkerCompleted 方法中的“throw new Exception()”处中断。最重要的是,真正的异常被 TargetInvocationException 包裹,调用堆栈被缩减为 Program.Main 方法,因此无法检查导致异常的代码。

如何防止这种包装?我做错了什么吗?

从TargetInvocationException提供的调用栈来看,有很多调用方法堆叠起来,对于我对消息循环的基本理解和对线程的不那么基本的理解来说太多了。

编辑:我知道 TargetInvocationException 中有 InnerException 属性,可以通过查看那里来跟踪错误,但这不是问题所在。问题是如何在使用 TargetInvocationException 包装真正的异常之前让 Visal Studio 停止,这样我就可以使用 VS IDE 提供的所有那些不错的调试功能。

最佳答案

是的,这是使 RunWorkerCompleted 事件在 UI 线程上运行的魔术的不幸副作用。没有您编写的使其运行的代码,因此除程序中仍然涉及的最后一条语句(启动消息循环的 Application.Run() 调用)之外,调试器无法显示任何相关信息。

您必须通过在抛出异常时强制调试器停止来进行调试。 Debug + Exceptions,勾选 CLR 异常的 Thrown 复选框。还要注意在没有调试器的情况下运行它时的行为,您将看到 Wheel Of Fortune 对话框。使用 Application.SetUnhandledExceptionMode() 修复此问题。

关于.net - 来自 BackgroundWorker_RunWorkerCompleted 的 TargetInvocationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10785940/

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