【发布时间】:2011-02-06 23:41:40
【问题描述】:
我不做很多 Windows GUI 编程,所以对于比我更熟悉 WinForms 的人来说,这可能都是常识。不幸的是,我今天在调试期间遇到了任何资源来解释这个问题。
如果我们在异步委托上调用 EndInvoke。我们将在重新抛出方法的执行过程中抛出任何异常。调用堆栈将反映异常的原始来源。
但是,如果我们在 Windows.Forms.Control 上执行类似操作,则 Control.EndInvoke 的实现会重置调用堆栈。这可以通过简单的测试或通过查看 Reflector 中的代码来观察。 EndInvoke 的相关代码摘录在这里:
if (entry.exception != null)
{
throw entry.exception;
}
我知道 Control 上的 Begin/EndInvoke 和异步委托是不同的,但我预计 Control.EndInvoke 上的行为会相似。
是否有任何理由控制不执行异步委托所做的任何事情来保留原始调用堆栈?
【问题讨论】:
标签: .net winforms exception asynchronous