C# 在windows服务应用程序中复制文件的常规策略

C# 在windows服务应用程序中复制文件的常规策略,c#,.net,C#,.net,我需要一个关于如何编写windows服务应用程序的建议,该应用程序将监视对驱动器上特定文件夹的更改,并将更改和新创建的文件复制到特定位置。现在,我打算使用FileSystemWatcher实现这一目的,但我想知道,当需要同时复制多个文件时,处理这种情况的最佳方法是什么?例如,一个巨大的文件仍在复制中,事件是否再次触发?我是否需要形成某种队列,并在复制完一个文件后,启动下一个文件?或者为每个文件创建一个新线程,并负责在该线程中进行复制?另外,我应该使用File.Copy方法,还是有更好/更快的方法

我需要一个关于如何编写windows服务应用程序的建议,该应用程序将监视对驱动器上特定文件夹的更改,并将更改和新创建的文件复制到特定位置。现在,我打算使用FileSystemWatcher实现这一目的,但我想知道,当需要同时复制多个文件时,处理这种情况的最佳方法是什么?例如,一个巨大的文件仍在复制中,事件是否再次触发?我是否需要形成某种队列,并在复制完一个文件后,启动下一个文件?或者为每个文件创建一个新线程,并负责在该线程中进行复制?另外,我应该使用File.Copy方法,还是有更好/更快的方法?

我会选择队列。事件处理程序用文件名填充队列,后台线程处理队列。
如果您使用的是.NET 4,则可以使用并确保线程安全

非编译示例代码:

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);
        }
    }
}

这也是我所知道的最好的解决方案。谢谢你的回复,起初我以为我理解了,但现在我有点困惑——如果员工很忙怎么办?“EnsureWorkerrisRunning()”是否需要在while(_queue.Count!=0)循环中?编辑:嗯,不,那会破坏目的。那么,如果工作进程很忙,会发生什么情况呢?我如何向它提供队列中的下一个文件?@AbramovAlexei:如果工作进程很忙,它已经在运行了,所以你不需要也不能再次启动它。因此,我让一个文件系统监视程序对正在更改的两个文件做出反应,比方说在1秒之内。backgroundworker需要5秒钟来复制第一个文件,因此当第二次触发my file_changed事件并看到该工作线程正忙时,它会忽略该工作线程还是什么?不。后台工作线程是后台线程。它正在逐个处理队列中的项目,因此在您的示例中,会检测到第一个文件并将其放入队列中。因为后台工作程序尚未运行
EnsureWorkerIsRunning
将启动它。后台工作人员将从队列中取出该项并开始复制它。执行此操作时,会检测到第二个文件并将其放入队列中。当后台工作程序复制完第一个文件后,它会将第二个文件从队列中取出,并复制该文件。。。