FileSystemWatcher在WPF应用程序中的失败和SQLite

时间:2011-12-21 23:57:24

标签: c# wpf sqlite indexing filesystemwatcher

所以我正在为我的公司创建一个客户索引程序,我基本上编码和工作的所有内容除了我希望索引程序观察用户指定的索引目录并动态更新底层数据存储以帮助消除需求经常完全索引。

我使用底层SQLite数据库编写了WPF / C#中的所有内容,我确信文件夹观察者在“非重载”下可以正常工作,但问题是我们使用TortoiseSVN以及当用户进行SVN更新等时。这会创建一个繁重的文件加载FileSystemWatcher和SQLite更新无法跟上(即使使用最大缓冲区大小)。基本上我每次看到观察者事件时都会进行数据库插入。

所以我的主要问题是......有没有人建议如何实现这个文件观察器来处理如此繁重的负载?

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

帮助...

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您可以使用队列在所有请求中排队。我对MS MessageQueue有很好的体验,它开箱即用,非常易于使用。

请参阅http://www.c-sharpcorner.com/UploadFile/rajkpt/101262007012217AM/1.aspx

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

Process.TotalProcessorTime.TotalMilliseconds/Environment.ProcessorCount

答案 2 :(得分:0)

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