2012-09-17 2 views
3

동일한 이벤트 처리기를 공유하는 FileSystemWatchers를 사용하고 있습니까?동일한 이벤트 처리기를 공유하는 FileSystemWatchers를 사용하고 있습니까?

여러 FileSystemWatchers가 동일한 이벤트 처리기를 사용하여 다른 디렉토리를 보는 것이 안전합니까?

Class Snippets 
    Private _watchPaths As New List(Of String) From {"x:\Dir1", "x:\Dir2"} 
    Private _watchers As List(Of FileSystemWatcher) 
    Private _newFiles As New BlockingCollection(Of String) 

    Sub Watch() 
     Dim _watchPaths As New List(Of String) From {"x:\Dir1", "x:\Dir2"} 
     Dim watchers As List(Of FileSystemWatcher) 

     For Each path In _watchPaths 
      Dim watcher As New FileSystemWatcher 
      AddHandler watcher.Created, Sub(s, e) 
      _trace.DebugFormat("New file {0}", e.FullPath) 
      'Do a little more stuff 
      _newFiles.Add(e.FullPath) 
      End Sub 
     Next 
    End Sub 
End Class 

또는 다음과 같은 클래스에서 FileSystemWatcher를 래핑하여 이벤트 처리기를 스레드로부터 안전하게 보호해야합니까? 여기

Class FileWatcher 
    Private _fileSystemWatcher As New FileSystemWatcher 

    Public Sub Start(path As String, filter As String, action As Action(Of Object, FileSystemEventArgs)) 
     With _fileSystemWatcher 
      .Path = path 
      .Filter = filter 
      .EnableRaisingEvents = True 
      AddHandler .Created, Sub(s, e) 
      action(s, e) 
      End Sub 
     End With 
    End Sub 

    Public Sub [Stop]() 
     _fileSystemWatcher.Dispose() 
    End Sub 
End Class 

헬퍼 클래스의 사용 : FileSystemWatcher에 의해 제기

Sub Watch 
    For Each path In _watchPaths 
     Dim Watcher as new FileWatcher 
     watcher.Start(path, "*.txt"), Sub(s, e) 
     _trace.DebugFormat("New file {0}", e.FullPath) 
     'Do a little more stuff 
     _newFiles.Add(e.FullPath) 
     End Sub)  
    Next 
End Sub 

답변

2

이벤트 스레드 풀 스레드에서 제기 기본적으로 있습니다. 즉, 여러 핸들러가 있는지 여부에 관계없이 이벤트 핸들러에서 사용되는 모든 데이터가 "공유"됩니다. 손상되지 않도록이 공유 데이터를 보호해야합니다 (예 : lock 액세스).

FileSystemWatcher.SynchronizingObject을 사용하여 FileSystemWatcher에서 발생하는 모든 이벤트가 단일 스레드 또는 알려진 스레드에서 발생하도록 동기화 컨텍스트를 제공 할 수 있습니다. 이는 일반적으로 이벤트 핸들러가 GUI 요소를 터치 할 때 수행됩니다.

+0

확장 코드 샘플은 도우미 클래스 FileWatcher의 사용법을 보여줍니다. 이 방법으로 이벤트 핸들러가 스레드로부터 안전합니까? –

+0

유일한 "공유"데이터가 BlockingCollection 객체 인 경우 스레드로부터 안전합니다. 다른 것을 추가하면 SyncLock과 같은 것을 사용해야합니다. –

+0

좋아, 공유 FileSystemWatcher 이벤트를 사용하여 내 첫 번째 예제에서는 스레드로부터 안전하지 않습니다. 그러나 각 Created() 이벤트 핸들러가 자체 FileSWatcher 인스턴스에서 실행되므로 FileWatcher 샘플과 마찬가지로 클래스의 FileSystemWatcher를 래핑하는 것은 잠금없이 스레드로부터 안전해야합니다. 아니면 여기에 뭔가 빠졌나요? –