FileSystemWatcher - 减少Visual Basic中的多事件提升(或减少多个事件的结果)(VS 2012 V11)

时间:2013-05-14 19:00:48

标签: vb.net multithreading events filesystemwatcher duplicate-removal

我试图在FileSystemWatcher更改时将事件数量减少到一个(或者至少在事件被提升时在文本框中显示文本,删除重复的文本或其他一些方法)。

Visual Basic 中是否有任何解决方法,或者至少要删除我已附加到状态日志文本框的重复文本(当OnChange sub为时叫)?

我对此做了大量研究,看起来没有“简单”修复。


以下是资源清单:

  • http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx(Microsfot文档,其中包含FileSystemWatcher可能引发多个事件的通知。)

  • http://weblogs.asp.net/ashben/archive/2003/10/14/31773.aspx(一篇文章指出,“为了解决这个问题[引发了两个事件],只需删除显式事件处理程序(AddHandler ...)。”没有进一步解释什么“...删除显式事件处理程序(AddHandler ...)。”表示。)

  • Why does FileSystemWatcher fire twice(这个问题被问到“什么”删除显式事件处理程序“是什么意思?”没有人回答这个问题。另外,给出的答案有这部分代码:

    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, _
     ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed
    

    当我尝试这个时,我在FileSystemWatcher1下得到蓝线:

      

    Handles子句需要在中定义一个WithEvents变量   包含类型或其基本类型之一。

    我也尝试了类似的解决方法,在EnableRaisingEvents = False中设置OnChanged sub,然后让程序执行我需要的操作,然后设置EnableRaisingEvents = True。它似乎有效,但有时只是。我相信这里有一些竞争条件。 EnableRaisingEvents不会足够快地设置为false,然后会调用多个OnChanges导致重复的结果。

  • http://spin.atomicobject.com/2010/07/08/consolidate-multiple-filesystemwatcher-events(一个相当复杂的修复,它在C#中,我可以理解其中一些,但我需要在Visual Basic中看到它。)

  • http://www.codeproject.com/Articles/58740/FileSystemWatcher-Pure-Chaos-Part-1-of-2(这篇文章的两篇文章是在C#中,但似乎是最可靠的修复。虽然这篇文章篇幅很长,但我并不了解所有内容,因为它不在Visual Basic中。 )


其他信息:

Private Sub FormBackUpFile_Load(ByVal sender As System.Object, ByVal e As _
 System.EventArgs) Handles MyBase.Load

Dim varFileSystemWatcher As New FileSystemWatcher()
Dim directoryPath As String = Path.GetDirectoryName(TextBoxFileLocation.Text)
        varFileSystemWatcher.SynchronizingObject = Me
        varFileSystemWatcher.Path = directoryPath
        varFileSystemWatcher.NotifyFilter = (NotifyFilters.LastWrite)

' THIS IS THE EVENT THAT IS RAISED TWICE OR MORE
AddHandler varFileSystemWatcher.Changed, AddressOf OnChanged
varFileSystemWatcher.EnableRaisingEvents = True

End Sub

 Private Sub OnChanged(source As Object, e As FileSystemEventArgs)
        ' Stops FileSystemWatcher from firing twice or more but,
        ' ONLY WORKS AT RANDOM.
        varFileSystemWatcher.EnableRaisingEvents = False

        ' Copies the specified file to the specified location
        My.Computer.FileSystem.CopyFile(e.FullPath, TextBoxCopyTo.Text & "\" _ 
        & e.Name, True)

        ' THIS IS WHERE THE TEXT WILL BE ADDED TO THE TEXTBOX TWICE OR MORE.
        TextBoxStatusLog.AppendText(Environment.NewLine & Environment.NewLine & _ 
        statusUpdate)

        ' Starts the FileSystemWatcher again
        varFileSystemWatcher.EnableRaisingEvents = True

End Sub

0 个答案:

没有答案