如何解决如果在VB.Net的块内调用了函数,则SyncLock会失去锁
我已经在VB.2010和2019中进行了尝试。 这是Windows桌面应用程序。
它具有FileSystemWatcher创建例程,该例程可以控制何时将文件放入文件夹,然后通过调用的函数处理该文件。调用的函数必须是同步的,并且如果调用多个实例,将出现无法预料的问题。
问题在于,一旦调用函数(DoMonitorFolder),锁就会丢失,并且在第一个块完成之前将再次输入synclock块。
下面是简化的代码。通过断点,我看到了:
- 如果将多个文件放入文件夹,则在第二次到达“结束同步”之前输入该块。将断点放在SyncLock之后和End SyncLock上
- 第二次输入时,RunningFileNowBol为true。输入时在DoFolderMonitor中将其设置为true,在返回之前将其设置为false。
- 如果取出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个小时的反复试验,我现在已经完成了。
如果有人有一个好的选择,除非释放它,否则它不会破坏锁,如果您让我知道,我将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。