Avi*_*Avi 5 .net multithreading asynchronous event-handling
我真的很尴尬地问这么一个微不足道的问题,但调试一些软件现在说服我,我真的不明白这个问题:
从20,000英尺高度看.NET事件是如何工作的?我不是指委托/事件处理程序模式和所有这些.我的意思是 - 大图是什么:
现在,什么是魔术?这与线程有什么关系?当事件发生时,运行我的代码的线程是否被中断,然后在事件处理程序返回后恢复?但我搜索并发现 .NET处理程序在原始线程中同步调用.那么谁负责停止和恢复代码A?如果事件是嵌套的(即事件1的事件处理程序运行时发生事件2)会发生什么?
编辑:据我所知,答案说,下一个事件的事件处理只有在当前运行的事件处理程序完成后才会运行.这意味着您的代码不会被中断:第n行将始终在第n-1行之后和第n + 1行之前立即运行.然而就在我发布问题之前,我正在调试程序,通过自动化控制Internet Explorer(使用Webius的SWExplorerAutomation).我非常肯定,当我在代码中踩线时,我被"绑架":-)到一些事件处理程序,并在事件处理程序完成其业务后返回到代码中的中断位置.这意味着要么不理解答案,要么在逐步通过调试器时程序的行为不同!
让我来解释一下你的问题。神奇之处在于 Windows 消息循环。您在示例中看到,实际上,当事件发生时,没有任何东西可以使代码 A 停止。相反,这就是顺序。
当代码 A 运行时,用户单击一个按钮。按钮的窗口消息已排队,但什么也没有发生。当代码 A 退出其函数或将控制权交还给消息循环时,将处理 Click 事件并运行事件处理程序。
试试这个实验。在程序的主线程中放置一个无限循环,然后单击用户界面。您会注意到用户界面将无响应,并且不会运行任何事件处理程序。