池并发事件的好方法

时间:2011-03-29 06:36:50

标签: c# events

我在C#中有一个应用程序,我从数据库存储库中获取数据库中每个更新的更新事件。当对数据库进行大型操作时会触发多个事件,并且我希望在收到这些事件时更新应用程序的GUI,但更新每个更新的GUI并不是最佳选择。

什么是“汇集”事件的好方法,只有在没有更多事件进入时才会做出反应,我的第一个想法是使用持续时间较短的计时器并为每个收到的新事件重置它但这看起来有点笨拙。是否有更好/更快/更简单的方法来解决这个问题?

我希望在正常更新期间不会出现明显的延迟。

4 个答案:

答案 0 :(得分:1)

我认为你的方式将是要走的路。我会写一个像EventAggregator这样的东西,它有一个计时器。此计时器将在第一个事件进入时启动,并在每次等待时间内进入新事件时重置。如果等待时间到了,它将举起自己的事件。

但是当你只有一个事件时,这也会导致一些延迟。所以要确保你想要这样的行为。还要确保在正确的线程中触发异步事件,否则您将遇到跨线程异常。也许文章实施Event-based Asynchronous Pattern文章可以给你一些关于这个问题的提示。另外,请查看此Timer article以获取正确的计时器类。

答案 1 :(得分:1)

您可以考虑使用Reactive Framework。

How to throttle event stream using RX?

答案 2 :(得分:1)

创建一个单独的Thread,等待ManualResetEvent。使用Queue<DbEvent>将新事件排入队列。当新的db事件到达时发出ManualResetEvent的信号。

每次将项目出列或排队时,请记住锁定队列。

通过这种方式,您可以从多个线程添加新的db事件,并且仍然可以一次处理一个事件。

答案 3 :(得分:0)

在我看来,一个好的方法是:

当数据库更新时,不要立即对该人进行更新,等待一段短暂但确定的时间段以查看是否有更多关于数据库的更新。经过一段时间之后,您应该将更新提交给gui。 然后你的gui将不会实时更新,但我认为几秒钟不是一个大问题(取决于api的用法)。好消息是你不需要在每次数据库更新时更新gui事件

我希望这会对你有所帮助。

干杯弗拉德。