如果在VB.Net的块内调用了函数,则SyncLock会失去锁

问题描述

我已经在VB.2010和2019中进行了尝试。 这是Windows桌面应用程序。

它具有FileSystemWatcher创建例程,该例程可以控制何时将文件放入文件夹,然后通过调用函数处理该文件调用函数必须是同步的,并且如果调用多个实例,将出现无法预料的问题。

问题在于,一旦调用函数(DoMonitorFolder),锁就会丢失,并且在第一个块完成之前将再次输入synclock块。

下面是简化的代码。通过断点,我看到了:

  1. 如果将多个文件放入文件夹,则在第二次到达“结束同步”之前输入该块。将断点放在SyncLock之后和End SyncLock上
  2. 第二次输入时,RunningFileNowBol为true。输入时在DoFolderMonitor中将其设置为true,在返回之前将其设置为false。
  3. 如果取出DoFolderMonitor,则只有在执行End Synchron之后才进入Synchron块。

那么在块中嵌入函数调用是否有限制? 是否有其他方法可以同步从FSW.Created调用DoFolderMonitor?

Private Sub FSW_Created(ByVal sender As Object,ByVal e As System.IO.FileSystemEventArgs) Handles FSW.Created
        SyncLock TheProgram ' & "FWS_CREATED"
            If RunningFileNowBol Then   
                inop = inop
            Else
                If Not DoFolderMonitor(pFFn:=e.FullPath) Then
                   GoTo ExitFunction
        End If
            End If
        End SyncLock
ExitFunction:
        Return
End Sub

解决方法

似乎System.Windows.Forms.Application.DoEvents()打破了SyncLock。当未执行DoEvents时,它将按预期工作。我不确定MuteX,但是经过大约10个小时的反复试验,我现在已经完成了。

如果有人有一个好的选择,除非释放它,否则它不会破坏锁,如果您让我知道,我将不胜感激。