C# 当程序运行时发生事件时会发生什么

C# 当程序运行时发生事件时会发生什么,c#,.net,C#,.net,我有一个关于c#事件的问题。当程序运行时(例如执行一个循环,需要几分钟才能完成)发生事件时(例如FileSystemWatcher将调用“created”事件),会发生什么情况 事件将被忽略? FSW不会调用该事件,因此将忽略创建新文件? 事件发生时必须执行的代码将在循环结束后执行 当然,循环与此事件无关,并且没有使用后台工作程序。这在很大程度上取决于实现。在FileSystemWatcher的情况下,我希望在系统创建的工作线程上引发该事件,因此它将与循环同时发生。如果它是一个UI事件,我希望它

我有一个关于c#事件的问题。当程序运行时(例如执行一个循环,需要几分钟才能完成)发生事件时(例如FileSystemWatcher将调用“created”事件),会发生什么情况

事件将被忽略? FSW不会调用该事件,因此将忽略创建新文件? 事件发生时必须执行的代码将在循环结束后执行


当然,循环与此事件无关,并且没有使用后台工作程序。

这在很大程度上取决于实现。在
FileSystemWatcher
的情况下,我希望在系统创建的工作线程上引发该事件,因此它将与循环同时发生。如果它是一个UI事件,我希望它被附加到消息循环的队列中,在当前阻止UI线程的任何工作之后进行处理(这是不应该做的)。除非这是一个精心设计的特征,否则一个事件在任何地方消失都是不寻常的——这似乎不太可能

对于由常规代码引起的许多其他事件,它们通常在遇到时同步处理

因此,我们有3种选择:

  • 由引发线程同步处理
  • 在工作线程上调用
  • 添加到UI线程的队列(通常通过“同步上下文”)

在这种情况下,我相信答案是“在工作线程上调用”,但更一般地说,这三种方法都可以用于事件

回调创建自己的线程,因此主计算不会中断,但是您可以调用例程来处理观察到的任何事件。FSW在单独的线程上调用事件FSW具有SynchronizingObject属性。它完全改变了它的工作方式。它将迫使FSW等待,直到您准备好接收通知,而不是随机启动另一个线程来告诉您发生了什么,让您来处理由此产生的后果。以后,当你不忙着做其他事情的时候。处理起来要容易得多。但在附加条件的情况下,确保事件不会太频繁地触发。