WPF应用中的FileSystemWatcher垮台和SQLite
本文关键字:SQLite FileSystemWatcher 应用 WPF | 更新日期: 2023-09-27 18:18:29
所以我正在为我的公司创建一个客户索引程序,我基本上已经编写了所有内容并正常工作,除了我希望索引程序监视用户指定的索引目录并动态更新底层数据存储,以帮助消除经常进行完整索引的需要。
我在WPF/c#中编码了一个底层SQLite数据库,我确信文件夹观察者会在"非重负载"下工作得很好,但问题是我们使用TortoiseSVN,当用户进行SVN更新等创建重文件加载时,FileSystemWatcher和SQLite更新只是无法跟上(即使是最大缓冲区大小)。基本上,每次点击watcher事件时,我都会执行数据库插入操作。
所以我的主要问题是……有没有人有关于如何实现这个文件监视器来处理如此沉重的负载的建议?我的一些想法是:(1)为所有查询创建一个分段集合,并使用计时器和线程稍后插入数据(2)将查询写入文件,并在稍后插入
时使用计时器线程帮助…
您希望在内存中缓冲从文件监视事件接收到的数据。因此,当从注册的文件监视器接收事件时,您可以尽可能快地将它们积累到内存中,以用于突发活动。然后,在一个单独的进程或线程上,从内存缓冲区中读取它们,并执行持久存储所需的任何操作或任何更耗时的进程。
您可以使用Queue将所有请求排队。我对MS MessageQueue有很好的体验,它开箱即用,非常容易使用。
见http://www.c-sharpcorner.com/UploadFile/rajkpt/101262007012217AM/1.aspx
然后有一个单独的WorkerThread,它从队列中获取预定义数量的元素并将它们插入数据库。这里我建议将单个插入合并到一个bulkinset中。如果您希望100%确定,可以在插入之前检查cpu和IO性能。下面是用于确定cpu利用率的代码片段:
Process.TotalProcessorTime.TotalMilliseconds/Environment.ProcessorCount
最简单的方法是让更新启动一个计时器(比如一分钟)。如果在此期间出现另一个更新,则将更改排队并重新启动计时器。只有一分钟过去了,你才会开始处理。