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

时间:2017-12-25 23:26:17

标签: c# events

我有这段代码:

serialPort.PinChanged +=Func5;
Func1();
Func2();
//here event throw
Func3();
Func4();
Console.ReadKey();

当我进入Func5时?只有当我的线程无法做什么?(在最后一行之后)?

当事件发生时?这是依赖巫婆类型的事件吗?

如何设置我想立即捕获此事件?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

这取决于应用程序的类型以及事件是否在同一个线程中上升。

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

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

您的PinChanged活动也是如此。当您的应用程序空闲时,它只会运行Func5,即所有其他代码都被终止。

同样,只有当您或所涉及的库函数不使用多线程时才会出现这种情况。除非文档明确说明,否则PinChanged不太可能在另一个线程中升级。

答案 2 :(得分:0)

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

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

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