gpt4 book ai didi

.net - Control.EndInvoke 为异常重置调用堆栈

转载 作者:行者123 更新时间:2023-12-04 12:59:51 29 4
gpt4 key购买 nike

我不会做很多 Windows GUI 编程,所以对于比我更熟悉 WinForms 的人来说,这可能都是常识。不幸的是,我今天在调试期间遇到了任何资源来解释这个问题。

如果我们在异步委托(delegate)上调用 EndInvoke。我们将在重新抛出方法的执行过程中抛出任何异常。调用堆栈将反射(reflect)异常的原始来源。

但是,如果我们在 Windows.Forms.Control 上执行类似的操作,Control.EndInvoke 的实现会重置调用堆栈。这可以通过简单的测试或通过查看 Reflector 中的代码来观察。 EndInvoke 的相关代码摘录在这里:

if (entry.exception != null)
{
throw entry.exception;
}

我知道 Control 和异步委托(delegate)上的 Begin/EndInvoke 是不同的,但我预计 Control.EndInvoke 会有类似的行为。

是否有任何理由 Control 不执行异步委托(delegate)所做的任何事情来保留原始调用堆栈?

最佳答案

我不知道真正的原因,但我可以猜测异步委托(delegate)类似于 RPC,而控制委托(delegate)可能基于 Win32 消息发送。不同的技术所以这个特性的影响可能不一样。异步委托(delegate)将受益于所有远程处理代码,开发人员将为此编写代码以在不同进程或计算机之间传输异常调用堆栈,而控制委托(delegate)将在同一进程中使用 PostMessage 模拟 RPC。不同的团队,不同的代码。

关于.net - Control.EndInvoke 为异常重置调用堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2621822/

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