当c#捕获并处理事件时?

当c#捕获并处理事件时?,c#,events,C#,Events,我有以下代码: serialPort.PinChanged +=Func5; Func1(); Func2(); //here event throw Func3(); Func4(); Console.ReadKey(); 当我进入Func5时?只有当我的线程没有什么可做的时候?(在最后一行之后) 或者什么时候开始?这取决于事件的类型吗 如何设置要立即捕获此事件 如果事件是异步触发的(即,在所显示代码的流控制之外),则无法知道事件何时会相对于所显示的代码运行。它甚至可能不会与显示的代码在同一

我有以下代码:

serialPort.PinChanged +=Func5;
Func1();
Func2();
//here event throw
Func3();
Func4();
Console.ReadKey();
当我进入
Func5
时?只有当我的线程没有什么可做的时候?(在最后一行之后)

或者什么时候开始?这取决于事件的类型吗


如何设置要立即捕获此事件

如果事件是异步触发的(即,在所显示代码的流控制之外),则无法知道事件何时会相对于所显示的代码运行。它甚至可能不会与显示的代码在同一线程上运行。

这取决于应用程序的类型以及事件是否在同一线程中引发

假设您有一个WinForms应用程序,上面显示的代码是从一个
Click
-事件运行的,并且
PinChanged
事件是在同一个线程(即UI线程)中触发的

WinForms从不中断您正在运行的代码。如果您有一个长时间运行的Click方法,并且用户在终止该方法之前再次单击,则第二次单击事件将被放入等待队列,第一次单击方法将继续,直到终止为止。这也意味着长时间运行的方法正在阻塞UI。另一方面,它使事情变得更简单,因为您不必处理代码块相互中断或同时运行,这可能非常棘手

您的
PinChanged
事件也是如此。只有当您的应用程序处于空闲状态,即所有其他代码终止时,它才会运行
Func5


同样,只有当您或所涉及的库函数不使用多线程时,这才是正确的。除非文档明确说明,
PinChanged
不太可能在另一个线程中上升。

只有当串行端口pin发生变化时才会调用
Func5
,这是函数订阅的事件。这可能发生在调用
Func1
之前,也可能永远不会。。。这完全取决于两个因素:

  • 如果事件发生
  • 事件发生时

如果您可以通过编程方式更改串行端口引脚,那么您就可以完全控制事件,并且基本上可以在需要时触发事件。。。否则,事件位于您的控制范围之外。

事件不会“抛出”或“捕获”(这些术语适用于异常,而不是事件)。如果您询问何时调用
Func5()
方法,这里的任何人都不可能告诉您,因为这完全取决于事件的实现方式,而您的问题根本没有显示出来。你需要提供一个很好的例子来清楚地说明你的问题(你在这里吗?)。我可以在我的代码上配置监听此事件并在另一个线程上处理它吗?这样我可以立即捕获此事件吗?不,事件发生的代码决定线程。但是您可以在另一个线程上启动串行端口侦听器。别忘了从事件侦听器访问UI,然后在另一个线程上运行,我可以在代码中配置侦听此事件并在另一个线程上处理它吗?这样我可以立即捕获此事件吗?为什么要在另一个线程中处理它?还有,更重要的是,如何在我的代码上配置监听此事件并在另一个线程上处理它,这样我可以立即捕获此事件吗?