2013-06-23 175 views
3

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

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

当然循环与这个事件无关,也没有使用后台工作人员等等。

+1

回调创建自己的线程,所以主要计算不会被打断,但您可以调用例程来处理您观察到的任何事件。 – SinisterMJ

+0

FSW在单独的线程上调用事件 –

+2

FSW具有SynchronizingObject属性。它彻底改变了它的工作方式。不要随意启动另一个线程来告诉你发生了什么事情,而是让你自己处理这些后果,这将迫使FSW等待你准备好接收通知。之后,当你不忙于做其他事情时。更容易处理。但是,如果连接了字符串,请确保该事件不会太频繁地触发。 –

回答

4

这取决于实施。在FileSystemWatcher的情况下,我预计该事件将在由系统创建的工作线程上提出 - 因此它将与循环同时发生。如果这是一个UI事件,我希望它被附加到消息循环的队列中,之后将被处理任何当前阻塞UI线程的工作(你不应该这样做)。如果一个事件只是一个故意的设计功能,那么这个事件会消失得无影无踪 - 这似乎不太可能。

在许多其他由常规代码引起的事件的情况下 - 它们通常在遇到时会同步处理

因此,我们有3个选项:

  • 通过使螺纹
  • 调用一个工作线程
  • 添加到UI线程的队列(通常通过“同步上下文”)同步处理

在这种情况下,我相信答案是“在工作者线程上调用的”,但所有3个都可能用于更普遍的事件

相关问题