Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 汇集并发事件的好方法_C#_Events - Fatal编程技术网

C# 汇集并发事件的好方法

C# 汇集并发事件的好方法,c#,events,C#,Events,我在C#中有一个应用程序,我从数据库存储库中获取数据库中每次更新的更新事件。在数据库上执行大型操作时,会触发多个事件,我希望在收到这些事件时更新应用程序的GUI,但为每次更新更新GUI并不完全是最优的 “汇集”事件并仅在没有更多事件进入时作出反应的好方法是什么?我的第一个想法是使用一个持续时间较短的计时器,并为接收到的每个新事件重置计时器,但这似乎有点笨拙。有没有更好/更快/更简单的方法来解决这个问题 我不希望在正常更新过程中出现明显的延迟。我想你的方法就是这样。我会编写类似于带有计时器的Eve

我在C#中有一个应用程序,我从数据库存储库中获取数据库中每次更新的更新事件。在数据库上执行大型操作时,会触发多个事件,我希望在收到这些事件时更新应用程序的GUI,但为每次更新更新GUI并不完全是最优的

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


我不希望在正常更新过程中出现明显的延迟。

我想你的方法就是这样。我会编写类似于带有计时器的
EventAggregator
。此计时器将在第一个事件出现时启动,并在等待时间内每次出现新事件时重置。如果达到等待时间,它将引发自己的事件


但是,当您只有一个事件时,这也会导致一些延迟。所以一定要确定你想在哪里做出这样的行为。还要确保在正确的线程中触发异步事件,否则会遇到跨线程异常。也许实现本文的文章可以给你一些关于这个问题的提示。另外,请仔细研究一下这一点,为您的目的选择正确的计时器类。

我认为您的方式就是正确的方式。我会编写类似于带有计时器的
EventAggregator
。此计时器将在第一个事件出现时启动,并在等待时间内每次出现新事件时重置。如果达到等待时间,它将引发自己的事件


但是,当您只有一个事件时,这也会导致一些延迟。所以一定要确定你想在哪里做出这样的行为。还要确保在正确的线程中触发异步事件,否则会遇到跨线程异常。也许实现本文的文章可以给你一些关于这个问题的提示。此外,还需要了解这一点,以便为您的目的选择正确的计时器类。

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

当数据库更新时,不要立即对guy进行更新,等待一段短但确定的时间,以查看是否对数据库进行了更多更新。在该时间段过后,您应该将更新提交到gui。 这样您的gui就不会实时更新,但我认为几秒钟的时间并不是什么大问题(取决于api的使用情况)。好的事情是,您不需要在每次数据库更新事件中更新gui

我希望这对你有帮助


干杯,弗拉德。

我认为一个好方法是:

当数据库更新时,不要立即对guy进行更新,等待一段短但确定的时间,以查看是否对数据库进行了更多更新。在该时间段过后,您应该将更新提交到gui。 这样您的gui就不会实时更新,但我认为几秒钟的时间并不是什么大问题(取决于api的使用情况)。好的事情是,您不需要在每次数据库更新事件中更新gui

我希望这对你有帮助


Pa>喝彩弗拉德。

< P>你可以考虑反应性框架。


< P>你可以考虑反应性骨架。


创建一个单独的
线程
,该线程等待
手动重置事件
。使用
队列
将新事件排队。当新的数据库事件到达时,向
ManualResetEvent
发送信号

请记住,每次将项目出列或入列时都要锁定队列


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

创建一个单独的
线程
,它等待
手动重置事件
。使用
队列
将新事件排队。当新的数据库事件到达时,向
ManualResetEvent
发送信号

请记住,每次将项目出列或入列时都要锁定队列


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

定义
没有更多事件出现的条件
例如,我更新数据库中的10行,然后快速连续地返回10个事件。在此之后,除非有其他更新,否则我不会再收到任何事件。您如何检测到这一点?这就是我的问题,你如何检测到没有更多的事件进入?换言之:当我收到一个事件时,我想更新GUI,但如果我连续快速收到几个事件,我想延迟GUI更新,这样我就不会强制进行多次更新。没有(简单的)方法知道会提前触发多少事件,因此检测“没有更多事件”的唯一解决方案是检查自上次事件以来的时间。批量更新通常以较快的顺序进行,因此事件之间的时间间隔小于1秒。请定义
无更多事件发生的条件
,例如,我更新数据库中的10行,然后以较快的顺序返回10个事件。在此之后,除非有其他更新,否则我不会再收到任何事件。您如何检测到这一点?这就是我的问题,你如何检测到没有更多的事件进入?换言之:当我收到一个事件时,我想更新GUI,但如果我连续快速收到几个事件,我想延迟GUI更新,这样我就不会强制进行多次更新。没有(简单的)方法知道会提前触发多少事件,因此检测“没有更多事件”的唯一解决方案是检查自上次事件以来的时间。批量更新通常以相当快的顺序进行,因此事件之间的时间间隔小于1秒。对于此应用程序,每次数据库更新延迟几秒是不可接受的。这将使应用程序在执行操作时表现得有点随机,然后在一段时间后应用程序upda