首页 > 解决方案 > 如果在 VB.Net 中的块内调用函数,SyncLock 将失去锁定

问题描述

我已经在 VB.2010 和 2019 中尝试过。这是一个 Windows 桌面应用程序。

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

问题是一旦调用函数(DoMonitorFolder),锁就会丢失,同步锁块将在第一个块完成之前再次进入。

简化代码如下。有了断点,我已经看到:

  1. 如果文件夹中有多个文件,则在第二次到达 End Synclock 之前进入该块。断点放在 SyncLock 之后和 End SyncLock 上
  2. 第二次进入时,RunningFileNowBol 为真。它在输入时在 DoFolderMonitor 中设置为 true,在返回之前设置为 false。
  3. 如果取出 DoFolderMonitor,则仅在 End Synclock 执行后才进入 Synclock 块,这是我所期望的。

那么在块中嵌入函数调用是否有限制?是否有替代方法可以同步从 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

标签: .netfilesystemwatchersynclock

解决方案


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

如果有人有一个很好的替代方案,除非被释放,否则不会打破锁,如果你让我知道,我将不胜感激。


推荐阅读