我需要一个关于如何编写Windows服务应用程序的建议,该应用程序将监视驱动器上某个文件夹的更改,并将更改的和新创建的文件复制到某个位置。现在,我将使用FileSystemWatcher来实现此目的,但我想知道当需要同时复制多个文件时,处理这种情况的最佳方法是什么?例如,仍在复制一个巨大的文件,并再次触发该事件?我是否需要形成某种类型的队列,每当完成一个文件的复制时,启动下一个文件?或者也许为每个文件创建一个新线程并负责该线程中的复制?另外,我应该使用File.Copy方法,还是有更好/更快的方式?
答案 0 :(得分:1)
我会去排队。队列由事件处理程序填充文件名,后台线程处理队列
如果您使用的是.NET 4,则可以使用ConcurrentQueue<T>
并保持线程安全。
非编译示例代码:
class AsyncFileCopier
{
BackgroundWorker _worker;
void OnNewFile(string fileName)
{
_queue.Enqueue(fileName);
EnsureWorkerIsRunning();
}
void EnsureWorkerIsRunning()
{
if(!_worker.IsBusy)
_worker.RunWorkerAsync();
}
void OnWorkerDoWork(...)
{
string fileName;
while(_queue.TryDequeue(out fileName)
{
CopyFile(fileName);
}
}
}