Filewatcher占用了大部分PC资源

时间:2016-08-11 11:10:44

标签: c# sqlite memory-leaks filesystemwatcher

我正在开发一个应用程序,它跟踪PC上可用驱动器上与目录相关的更改,并将这些更改保存在sqlite DB中。以下代码中的所有内容都按预期正常工作。但是当我通过将大约100个目录及其嵌套目录复制在一起进行测试时,它会冻结应用程序并冻结Windows操作系统的复制过程。

我没有办法管理它,因为批量文件复制的代码占用了大部分PC资源。有什么可以优化它的原因吗?而是设置“IncludeSubDirectories = False”?

class DirWatcher
{        
    private FileSystemWatcher dirWatcher = null;

    public void StartCapture()
    {
        string[] drives = Environment.GetLogicalDrives();

        foreach (string drive in drives)
        {
            DriveInfo driveInfo = new DriveInfo(drive);
            if (driveInfo.DriveType == DriveType.Fixed)
            {
                //Director Watcher
                dirWatcher = new FileSystemWatcher(drive);
                dirWatcher.NotifyFilter = NotifyFilters.DirectoryName;


                dirWatcher.Created += dirWatcher_Created;
                dirWatcher.Deleted += dirWatcher_Created;
                dirWatcher.Renamed += dirWatcher_Renamed;

                dirWatcher.IncludeSubdirectories = true;
                dirWatcher.EnableRaisingEvents = true;

            }
        }
    }

    void dirWatcher_Renamed(object sender, RenamedEventArgs e)
    {
        try
        {
            Task.Factory.StartNew(() =>
                        {
                            saveToDB("Folder",
                                     e.ChangeType.ToString(),
                                     e.FullPath,
                                     Utility.UnixDTstamp(DateTime.Now).ToString(),
                                     Environment.UserName);

                        });
        }
        finally
        {
            dirWatcher.Renamed -= dirWatcher_Renamed;
        }
    }

    void dirWatcher_Created(object sender, FileSystemEventArgs e)
    {
        try
        {
            Task.Factory.StartNew(() =>
            {
                saveToDB("Folder",
                        e.ChangeType.ToString(),
                        e.FullPath,
                        Utility.UnixDTstamp(DateTime.Now).ToString(),
                        Environment.UserName);
            });
        }
        finally
        {
            dirWatcher.Created -= dirWatcher_Created;
        }
    }

    public void StopCapture()
    {
        dirWatcher.IncludeSubdirectories = false;
        dirWatcher.EnableRaisingEvents = false;
        dirWatcher.Dispose();
    }

    public void saveToDB(string DirOrFile, string action, string path, string time, string userName)
    {
        //SavetoDB code will be here.
    }
}
}

1 个答案:

答案 0 :(得分:0)

可能会减慢(甚至击败)您的程序的一件事是在网络上连接驱动器。我不相信你可以在这些上成功设置Filewatcher,特别是如果驱动程序是基于LINUX的。即使你可以,它也会在性能上变得冰冷

我还发现Filewatcher在观看文件夹层次结构时会错过事件。所以一般来说,我要说你需要找到或写一个替代这个功能,这个功能是如此有缺陷,应该弃用。也许是一个可以让你观看Windows消息循环的钩子?