代码之家  ›  专栏  ›  技术社区  ›  Avi

异步和。NET事件?

  •  5
  • Avi  · 技术社区  · 16 年前

    1. 代码A正在做某事。
    2. 另一个魔术发生了 事件处理程序返回后。

    found out 那。NET处理程序在原始线程中同步调用。那么,谁来负责停止和恢复代码A呢?如果事件是嵌套的(即事件2发生在事件1的事件处理程序运行时),会发生什么?

    编辑 :据我所知,答案说事件处理者 事件将仅在当前运行的事件处理程序完成后运行。这意味着您的代码不会被中断:第n行将始终在第n-1行之后和第n+1行之前立即运行。然而,就在我发布问题之前,我正在调试一个通过自动化控制Internet Explorer的程序(使用Webius的SWEXPLORAutomation)。我很确定,当我逐行遍历代码时,我被“绑架”到了某个事件处理程序:-),一旦该事件处理程序完成了它的业务,我就回到了代码中被中断的位置。这意味着要么不理解答案,要么程序在调试过程中表现不同!

    3 回复  |  直到 16 年前
        1
  •  3
  •   Andrew Keith    16 年前

    让我来解释一下你的问题。神奇之处在于windows消息循环。实际上,在您的示例中可以看到,当事件发生时,没有任何东西会使代码A停止。相反,这就是顺序。

        2
  •  2
  •   Henk Holterman    16 年前

    将看到 MessageLoop 它在里面 Application.Run() .

    简单地说,这是一个while循环,在应用程序的整个生命周期内运行

      // pseudo code, I did not reflector Application.Run
      while (GetMessage(ref msg)
      {
         DispatchMessage(ref msg);
      }
    

    Application.DoEvents() ,但要远离它。

        3
  •  1
  •   Dror Helper    16 年前

    事件是指向函数的指针(就像我们过去在C++中一样)。当你使用纯香草时。NET事件,您实际上是在调用使用+=连接到该事件的函数。因此,从20000英尺外,你的代码实际上会调用其他代码,就像调用另一个函数一样。

    在WinForms/WPF控件中,我们还需要考虑一个消息循环: