繁体   English   中英

如果在 VB.Net 的块内调用函数,SyncLock 将失去锁定

[英]SyncLock loses lock if a function is called within the block in VB.Net

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

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

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

简化代码如下。 使用断点我已经看到:

  1. 如果将多个文件放入文件夹,则在第二次到达 End Synclock 之前进入该块。 BreakPoints 被放置在 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM