簡體   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