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

标签 .net winforms exception asynchronous

我不会做很多 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/

相关文章:

windows - 此文件位于本地网络之外的位置

c# - 判断可能出现的字符串赋值运算符异常

.net - 如何让客户端和服务器保持对话

.net - 性能计数器是实现每秒平均计数的最佳方式吗?

c# - 如何根据类中属性的类型动态创建 C# 泛型字典?

exception - 我想知道,为什么会得到redis.clients.jedis.exceptions.JedisConnectionException异常?

C++ 异常未按预期处理

.net - 开发适用于 Windows 7 的应用程序 : Best practices/things to watch out for

c# - 使用 Winforms 应用程序分发 Access 数据库

c# - 如何同步共享的 IProgress<int>