如何防止 vb.net 应用程序阻止Windows源文件夹线程以进行未来的D&D操作

How to prevent vb.net app from blocking the windows source folder thread for future D&D ops

提问人:Sam Marrocco 提问时间:3/10/2023 更新时间:3/10/2023 访问量:21

问:

我有一个 vb.net 应用程序,允许将文件拖放到其中进行处理。处理过程可能很长,但不需要全线程应用程序的额外工作。

我的应用程序的两个实例同时在桌面上运行,以允许将文件拖动到每个应用程序实例中。要拖动的文件在 Windows 文件资源管理器窗体上的文件夹中可见。将 file1 第一次拖放到我的应用程序的第一个实例中时,其行为符合预期,并开始处理。但是,当我尝试将 file2 从桌面文件资源管理器拖到应用程序的第二个实例中时,源文件资源管理器窗口不允许对第二个文件进行任何选择或拾取 - 显示一个光标,似乎表明拖放尚未发生或正在等待原始的第一次拖放完成。

我的拖放代码非常简单

Private Sub Form_DragEnter(sender As Object, e As DragEventArgs) Handles Me.DragEnter
  e.Effect = DragDropEffects.Copy
End Sub
           
Private Sub Form_DragDrop(sender As Object, e As DragEventArgs) Handles Me.DragDrop
  Dim Complete_PathFilenames() As String = e.Data.GetData("FileDrop", False)
  For Each ThisScriptFile As String In Complete_PathFilenames
    PerformMyLongRunningProcess(ThisScriptFile)
  Next
End Sub

除了将我的 PerformMyLongRunningProcess() 方法作为新线程或进程启动之外,有没有办法在我的应用程序中获取拖放的文件,然后立即释放我的应用程序似乎在 Windows 桌面资源管理器窗口/文件上具有的“抓地力”,以便我可以继续将源文件拖放到其他实例中(甚至继续使用该桌面文件资源管理器窗口)?

vb.net 多线程 拖放 线程安全

评论

0赞 Craig 3/10/2023
您可以在 中添加显式屈服点,但执行最终在另一个线程上运行它(通过任务系统显式或隐式运行它)可能更合适,例如 )。PerformMyLongRunningProcessTask.Run
0赞 Hursey 3/10/2023
澄清一下,当您说您的应用程序有两个实例正在运行时。是同一可执行文件的两个副本正在运行,还是在可执行文件的同一实例中执行两个单独的表单实例?我之所以问,是因为如果它实际上是可执行文件的两个实例,那么实际上它们已经在单独的线程中运行,所以一个实例中发生的事情不应该真正影响另一个实例,除非您不遗余力地这样做。
0赞 Sam Marrocco 3/10/2023
@ Hurley:两个实例,意味着同一可执行文件的两个副本同时运行。这就是它如此令人惊讶的原因——第一个正在运行的实例以某种方式从未完成的拖放操作中“捆绑”桌面,直到该过程完成。

答: 暂无答案