Bri*_*sen 7 .net asynchronous exception winforms
我没有做很多Windows GUI编程,所以对于比我更熟悉WinForms的人来说,这可能都是常识.不幸的是,我无法找到任何资源来解释这个问题,我今天在调试过程中遇到过.
如果我们在异步委托上调用EndInvoke.我们将在重新抛出的方法执行期间抛出任何异常.调用堆栈将反映异常的原始来源.
但是,如果我们在Windows.Forms.Control上执行类似的操作,Control.EndInvoke的实现将重置调用堆栈.这可以通过简单的测试或查看Reflector中的代码来观察.EndInvoke的相关代码摘录如下:
if (entry.exception != null)
{
throw entry.exception;
}
Run Code Online (Sandbox Code Playgroud)
我理解控件和异步委托上的Begin/EndInvoke是不同的,但我希望Control.EndInvoke上有类似的行为.
是否有任何理由控制不执行异步委托保留原始调用堆栈的任何操作?
小智 1
我不知道真正的原因,但我可以猜测异步委托类似于 RPC,而控制委托可能基于 Win32 消息发送。不同的技术所以这个功能的影响可能不一样。异步委托将受益于所有远程处理代码,开发人员将编写代码以在不同进程或计算机之间传输异常调用堆栈,而控制委托将在同一进程内使用 PostMessage 模拟 RPC。不同的团队,不同的代码。
| 归档时间: |
|
| 查看次数: |
430 次 |
| 最近记录: |