C#事件处理程序触发多次,但需要在10秒内处理一次

我有一个条件,我是否有倾听事件的听众。

试图做下面的事情,事件处理程序可能会收到多个事件,但是我需要将它们合并为一个,并触发一次。

private static void QueueRequestChanged() { // This may get 1 or 10 events here. // want to keep wait for 10 seconds. // trigger one event to handle it further } 

我正在努力做到这一点,以避免死锁的情况。 任何关于方法的build议都会有所帮助。

谢谢。

Solutions Collecting From Web of "C#事件处理程序触发多次,但需要在10秒内处理一次"

你应该看看Reactive Extensions(Rx): https : //www.nuget.org/packages/System.Reactive/

如果你知道LINQ,它会使这些事情变得简单:

 using System.Reactive.Linq; ... System.Reactive.Linq.Observable .FromEventPattern<RoutedEventArgs>(btn, "Click") .Sample(TimeSpan.FromSeconds(10)) //take the last event for every 10 seconds .Subscribe(_ => { MessageBox.Show("clicked!"); }); 

以上示例代码捆绑了最近10秒内由名为“btn”的WPF Button引发的所有Clicked事件,并通过显示MessageBox处理最新的事件。

您需要将RoutedEventArgs更改为EventArgs的类型,“Click”为事件的实际名称,“btn”为引发事件的对象的名称。

你可以有下面的代码,这不会让你的线程处于等待状态:

 private const Timespan c_maxTime = new Timespan(0, 0, 10); private static DateTime? s_lastValidEvent; private static object s_lockObject = new Object(); private static void QueueRequestChanged() { lock (s_lockObject) { if (!s_lastValidEvent.HasValue || (DateTime.Now - s_lastValidEvent.Value) > c_maxTime) { // Do whatever the event is supposed to trigger s_lastValidEvent = DateTime.Now; } } } 

现在,我做了如下,似乎为我工作得很好。

  var events = 0 private static void QueueRequestChanged() { events++; Task.Delay(10000).ContinueWith(t => Trigger()); } private static void Trigger() { if(events > 0) { events = 0; // do code here } } 

任何更好的建议,将不胜感激。 谢谢。