.net - 如果在 VB.Net 中的块内调用函数,SyncLock 将失去锁定
问题描述
我已经在 VB.2010 和 2019 中尝试过。这是一个 Windows 桌面应用程序。
它有一个 FileSystemWatcher 创建例程,该例程可以控制何时将文件放入文件夹,然后通过调用的函数处理该文件。调用的函数必须是同步的,如果调用多个实例会出现不可预知的问题。
问题是一旦调用函数(DoMonitorFolder),锁就会丢失,同步锁块将在第一个块完成之前再次进入。
简化代码如下。有了断点,我已经看到:
- 如果文件夹中有多个文件,则在第二次到达 End Synclock 之前进入该块。断点放在 SyncLock 之后和 End SyncLock 上
- 第二次进入时,RunningFileNowBol 为真。它在输入时在 DoFolderMonitor 中设置为 true,在返回之前设置为 false。
- 如果取出 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 个小时的反复试验,我现在已经完成了。
如果有人有一个很好的替代方案,除非被释放,否则不会打破锁,如果你让我知道,我将不胜感激。
推荐阅读
- html - 将文件导入网页 [SELENIUM]
- javascript - 传递给组件时打字稿混乱
- python - 在 Python 中使用 tricontourf 的最佳方法
- php - 如何将我的 React 应用程序连接到 PHP 文件?
- android - 如何从 attachBaseContext() 访问 ViewModel?
- bash - 天蓝色管道模板如何引用同一模板存储库中的文件?
- tensorflow - Tensorflow 非归一化日志概率
- c++ - 窗口过程和 CreateWindowEx 函数
- angular - 如何在 Angular 中将 Mat Table 网格扩展到第三级?
- kotlin-coroutines - MutableStateFlow 无法收集流上发出的值