这是处理Windows服务中文件移动的最佳方法吗?我们有许多匹配和移动的文件,但最终用户可能会在移动时打开文件。
这就是代码目前所说的内容:
Do While IO.File.Exists(OriginalFilePath)
Try
IO.File.Move(OriginalFilePath, BestMatchPath)
Catch ex As IO.IOException
Log(TraceLevel.Warning, "The file '{0}' was unable to be moved (probably opened by someone)", OriginalFilePath)
Threading.Thread.Sleep(1000)
End Try
Loop
有没有更好的方法来管理它?我曾想过将其线程化以允许进程继续,但目前我不确定这是否可行,因为其余的进程可能需要文件路径准确。
答案 0 :(得分:2)
建议:在服务Start()
方法中,激活System.Timers.Timer
以定期运行文件移动循环,而不需要Sleep(1000)
调用。这样,在当前运行中未移动的文件将不会阻止其他(未锁定)文件的移动。有问题的文件将有机会在以后的试验中移动。调整计时器间隔以满足您的需求。
Timer
是处理线程的有效方法。服务进程是重复执行代码段的适当位置。请注意,没有Sleep(1000)
的循环不会阻止。
答案 1 :(得分:2)
由于这是一项Windows服务,并且根据您尝试同时移动的文件数量,我会考虑为每个文件移动使用后台线程。如果使用BackgroundWorker类型,则可以将任何异常编组回主线程,然后等待X分钟再尝试再次移动文件。
通常我不提倡多线程解决方案,但在这种情况下,线程之间没有共享状态,因此控制任何线程问题要容易得多。
至于做一些依赖于所有文件移动成功的其他任务,你可以加入后台线程,这样你就可以知道他们什么时候完成了。