【问题标题】:FileSystemWatcher downfall and SQLite in a WPF appWPF 应用程序中的 FileSystemWatcher 崩溃和 SQLite
【发布时间】:2011-12-21 23:57:23
【问题描述】:

因此,我正在为我的公司创建一个客户索引程序,并且基本上所有内容都已编码和工作,除了我希望索引程序监视用户指定的索引目录并即时更新基础数据存储以帮助消除需要经常进行完整索引。

我使用底层 SQLite 数据库在 WPF/C# 中编写了所有内容,我确信文件夹监视程序在“非重负载”下会很好地工作,但问题是我们使用 TortoiseSVN 并且当用户执行 SVN 更新等时. 这会创建一个沉重的文件负载,FileSystemWatcher 和 SQLite 更新无法跟上(即使使用最大缓冲区大小)。基本上,每次点击观察者事件时,我都会插入数据库。

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

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

帮助....

【问题讨论】:

    标签: c# wpf sqlite indexing filesystemwatcher


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以使用队列来排队所有请求。我在 MS MessageQueue 方面取得了很好的经验,它开箱即用,非常易于使用。

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

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

      Process.TotalProcessorTime.TotalMilliseconds/Environment.ProcessorCount
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • (注意,当然,这只有在您的系统中有大量空闲时间时才有效)
        猜你喜欢
        • 2011-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多