C# WPF应用程序中的FileSystemWatcher崩溃和SQLite

C# WPF应用程序中的FileSystemWatcher崩溃和SQLite,c#,wpf,sqlite,indexing,filesystemwatcher,C#,Wpf,Sqlite,Indexing,Filesystemwatcher,因此,我正在为我的公司创建一个客户索引程序,我基本上已经完成了所有编码和工作,除了我希望索引程序能够监视用户指定的索引目录,并动态更新底层数据存储,以帮助消除经常进行完全索引的需要 我用一个底层SQLite数据库在WPF/C中对所有内容进行了编码,我确信文件夹监视程序在“非重载”情况下会工作得很好,但问题是我们使用了TortoiseSVN,当用户执行SVN更新等操作时,会产生一个重载文件,FileSystemWatcher和SQLite更新无法跟上(即使使用最大缓冲区大小)。基本上,我是在每次点

因此,我正在为我的公司创建一个客户索引程序,我基本上已经完成了所有编码和工作,除了我希望索引程序能够监视用户指定的索引目录,并动态更新底层数据存储,以帮助消除经常进行完全索引的需要

我用一个底层SQLite数据库在WPF/C中对所有内容进行了编码,我确信文件夹监视程序在“非重载”情况下会工作得很好,但问题是我们使用了TortoiseSVN,当用户执行SVN更新等操作时,会产生一个重载文件,FileSystemWatcher和SQLite更新无法跟上(即使使用最大缓冲区大小)。基本上,我是在每次点击watcher事件时插入数据库

所以我的主要问题是…有人对如何实现这个文件监视程序来处理如此繁重的负载有什么建议吗

我的一些想法是:(1)为所有查询创建一个暂存集合,并在稍后使用计时器和线程插入数据(2)将查询写入文件,并在稍后使用计时器线程进行插入


帮助…

最简单的方法是让更新启动一个计时器(例如,一分钟)。如果同时出现另一个更新,则将更改排入队列并重新启动计时器。只有当一分钟没有活动时,您才开始处理。

您希望在内存中缓冲从文件监视事件接收到的数据。因此,当从注册的文件监视程序接收事件时,您可以尽可能快地将它们累积到内存中以进行突发活动。然后在一个单独的进程或线程上,从内存缓冲区中读取它们,并执行持久存储所需的任何操作,或者执行时间更为密集的任何进程

您可以使用队列对所有请求进行排队。我对MS MessageQueue有很好的体验,它是现成的,非常容易使用

然后有一个单独的WorkerThread,它从队列中获取预定义数量的元素并将它们插入数据库。在这里,我建议将单个插入合并为一个bulkinsert。 如果您想100%确定,可以在插入之前检查cpu和IO性能。 下面是用于确定cpu利用率的代码片段:

Process.TotalProcessorTime.TotalMilliseconds/Environment.ProcessorCount

(注意,这仅在系统中存在大量空闲时间时有效)