2008-11-17 84 views
2

这是处理文件在Windows服务中移动的最佳方式吗?我们有很多匹配并移动的文件,但最终用户可能会在移动时打开文件。尝试File.Move()时处理打开的文件

这就是代码当前说:

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 

是否有更好的方法来管理呢?我曾想过对它进行线程化以允许进程继续,但目前我不确定这是否可行,因为该进程的其余部分可能需要文件路径才是准确的。

回答

2

由于这是一个Windows服务,并且根据您尝试同时移动的文件数量,我会考虑为每个文件移动使用​​后台线程。如果使用BackgroundWorker类型,则可以将任何异常封送回主线程,然后等待X分钟,然后再次尝试移动文件。

通常我不会主张多线程解决方案,但在这种情况下,线程之间没有共享状态,所以控制任何线程问题都容易得多。

至于做一些其他的任务,取决于所有的文件移动成功,你可以加入到后台线程,让你知道什么时候全部完成。

2

建议:在服务Start()方法中,激活System.Timers.Timer以定期运行文件移动循环,而不调用Sleep(1000)。这样,当前运行中未移动的文件不会阻止其他(未锁定)文件的移动。有问题的文件将有机会在以后的试验中移动。调整计时器间隔以适应您的需求。

@Andy想过线程 - Timer是处理线程的有效方法。服务进程是重复执行代码段的适当位置。请注意,没有Sleep(1000)的循环将不会被阻止。

+0

我不相信睡觉时的线程会阻止任何其他进程。 – kenny 2008-11-17 11:20:22