.NET上相同功能的多事件处理

时间:2013-02-13 08:59:48

标签: c# .net vb.net events

我最近测试了一些FileSystemWatcher,并想知道事件处理在.NET中是如何工作的。例如,在VB.NET中使用此代码:

Dim fsw1, fsw2, fsw3 As New FileSystemWatcher()

Private Sub fsw_Error(sender As Object, e As ErrorEventArgs) _
                                 Handles fsw1.Error, fsw2.Error, fsw3.Error
    Dim iCont As Integer = 1
    Dim fsw As FileSystemWatcher = CType(sender, FileSystemWatcher)

    While Not fsw.EnableRaisingEvents AndAlso iCont < 120
        iCont += 1

        Try
            fsw.EnableRaisingEvents = True
            txtResultado.Clear()
        Catch
            fsw.EnableRaisingEvents = False
            Threading.Thread.Sleep(30000)
        End Try
    End While
End Sub

每次FileSystemWatcher执行任何错误都会执行该函数。为每个FileSystemWatcher生成函数的不同线程?他们可以在同时执行多个时互相干扰吗?

C#和VB.NET之间可能有区别吗?

3 个答案:

答案 0 :(得分:1)

对于哪个线程调用事件没有约束;如果你想在另一个线程中调用一个事件,你可以在.NET中自由地这样做。说实话,我无法想象实现FileSystemWatcher而不使用单独的线程或async IO作为观察者(如果发现更改则调用事件),因为您不希望事件中断应用程序的正常流程。

.NET中的事件使用调用列表,该列表在引发事件时调用。调用事件时,将在单个线程中遍历调用列表并调用每个方法。就这么简单。

功能是.NET功能,所以C#和VB.Net都是一样的

答案 1 :(得分:1)

你对事件处理有一个基本的误解。看起来您假设所有触发的事件都将被发送到同一个函数 - 或者让我们说明函数的相同实例

事实并非如此。每次引发事件时,都会调用函数fsw_error。如果已经有10次执行该功能并不重要。所以在该函数中等待直到另一个事件被引发(看起来你正在尝试这样做)不起作用。

但是,您可以将事件处理程序封装在(实例化的)类中,并确保所有引发的事件执行都使用相同的变量范围。我不确定,如果在不同的线程上触发事件(不这么认为),但如果是这种情况,你需要注意同步Access。当然。

Private Class MyEventHandlerHolder
   private iCont as Integer = 0;    

   Private Sub fsw_Error(sender As Object, e As ErrorEventArgs) _
                             Handles fsw1.Error, fsw2.Error, fsw3.Error

       iCont += 1

End Sub
每当文件系统Watcher触发错误事件时,iCont现在都会增加。

fsw = new FileSystemWatcher()
fsw2 = new FileSystemWatcher()
fsw.EnableRaisingEvents = true;
fsw2.EnableRaisingEvents = true;
myHandler  = new MyEventHandlerHolder();
AddHandler fsw.Onerror, AdressOf myHandler.fsw_error //not sure about the right Event Name in vb
AddHandler fsw2.Onerror, AdressOf myHandler.fsw_error 

我的vb很久以前了。也许你不能将实例的方法作为处理程序。但是需要一个静态(或单例)Handler类。

答案 2 :(得分:1)

当FileSystemWatchers引发事件时,应该在线程池线程上调用该处理程序。在由一个FileSystemWatcher引发的事件的冗长处理可能延迟处理由一个FileSystemWatchers引发的另一个事件时,事件可能会相互干扰。在这种程度上,您可以在事件处理程序中使用专用线程来执行冗长的阻塞工作。

VB.NET和C#之间应该没有区别。