동일한 이벤트 처리기를 공유하는 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
확장 코드 샘플은 도우미 클래스 FileWatcher의 사용법을 보여줍니다. 이 방법으로 이벤트 핸들러가 스레드로부터 안전합니까? –
유일한 "공유"데이터가 BlockingCollection 객체 인 경우 스레드로부터 안전합니다. 다른 것을 추가하면 SyncLock과 같은 것을 사용해야합니다. –
좋아, 공유 FileSystemWatcher 이벤트를 사용하여 내 첫 번째 예제에서는 스레드로부터 안전하지 않습니다. 그러나 각 Created() 이벤트 핸들러가 자체 FileSWatcher 인스턴스에서 실행되므로 FileWatcher 샘플과 마찬가지로 클래스의 FileSystemWatcher를 래핑하는 것은 잠금없이 스레드로부터 안전해야합니다. 아니면 여기에 뭔가 빠졌나요? –