-1

最近、いくつか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 の違いがあるのではないでしょうか?

4

3 に答える 3

1

イベント処理に関する基本的な誤解があります。トリガーされたすべてのイベントが同じ関数に送信される、または関数の同じインスタンスに送信されると想定しているようです。

これはそうではありません。イベントを発生させるたびに、関数 fsw_error が呼び出されます。その関数がすでに 10 回実行されていても問題ありません。したがって、別のイベントが発生するまでその関数内で待機する (それをしようとしているように見えます) は機能しません。

ただし、(インスタンス化された) クラス内にイベントハンドラーをカプセル化して、発生したすべてのイベント実行が変数の同じスコープで機能することを確認できます。イベントが異なるスレッドで発生するかどうかはわかりませんが(そうは思わないでください)、その場合はもちろんアクセスの同期に注意する必要があります。

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

ファイルシステム ウォッチャーがエラー イベントを発生させるたびに、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 クラスが必要です。

于 2013-02-13T09:17:45.087 に答える
1

どのスレッドがイベントを呼び出すかについての制約はありません。別のスレッドでイベントを呼び出したい場合は、.NET で自由に呼び出すことができます。正直なところ、イベントがアプリケーションの通常のフローを中断させたくないため、別のスレッドまたはウォッチャー用の非同期 IO (変更が見つかった場合にイベントを呼び出す) を使用せずに FileSystemWatcher を実装することは想像できません。

.NET のイベントは、イベントが発生したときに呼び出される呼び出しリストで機能します。イベントを呼び出すと、呼び出しリストがウォークされ、各メソッドが 1 つのスレッドで呼び出されます。そのような単純な。

機能は .NET 機能であるため、C# と VB.Net の両方で同じです。

于 2013-02-13T09:14:02.107 に答える