Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>below is a class that I'm hoping does the trick for you. including sample usage shown at the bottom.</p> <pre><code>public class EventDelayer { /// &lt;summary&gt; /// Contains info on an individual event that was queued; /// &lt;/summary&gt; public class DelayedEventInfo { private readonly object _sender; private readonly EventArgs _eventArgs; private readonly DateTime _eventTime; public DelayedEventInfo(object sender, EventArgs eventArgs, DateTime eventTime) { _sender = sender; _eventArgs = eventArgs; _eventTime = eventTime; } public object Sender { get { return _sender; } } public EventArgs EventArgs { get { return _eventArgs; } } public DateTime EventTime { get { return _eventTime; } } } /// &lt;summary&gt; /// contains a list of /// &lt;/summary&gt; public class DelayedEventArgs : EventArgs, IEnumerable&lt;DelayedEventInfo&gt; { private readonly List&lt;DelayedEventInfo&gt; _eventInfos; public DelayedEventArgs(IEnumerable&lt;DelayedEventInfo&gt; eventInfos) { _eventInfos = new List&lt;DelayedEventInfo&gt;(eventInfos); } public IEnumerator&lt;DelayedEventInfo&gt; GetEnumerator() { return _eventInfos.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _eventInfos.GetEnumerator(); } } private readonly List&lt;DelayedEventInfo&gt; _infoList = new List&lt;DelayedEventInfo&gt;(); private readonly TimeSpan _delayTime; private readonly object _lock = new object(); private System.Threading.Timer _timer; public event EventHandler&lt;DelayedEventArgs&gt; DelayedEvent; public EventDelayer(TimeSpan delayTime) { _delayTime = delayTime; } /// &lt;summary&gt; /// call to 'enqueue' an event. /// &lt;/summary&gt; public void Enqueue(object sender, EventArgs args) { lock (_lock) { _infoList.Add(new DelayedEventInfo(sender, args, DateTime.Now)); if (_timer != null) { _timer.Dispose(); _timer = null; } _timer = new System.Threading.Timer(ThreadProc, this, _delayTime, TimeSpan.FromMilliseconds(-1)); } } /// &lt;summary&gt; /// raises the event. /// &lt;/summary&gt; private void HandleTimer() { lock (_lock) { var ev = this.DelayedEvent; if (ev != null) { DelayedEventArgs args = new DelayedEventArgs(_infoList); Invoke(()=&gt; ev(this, args)); } _infoList.Clear(); } } private static void ThreadProc(Object stateInfo) { EventDelayer thisObj = (EventDelayer)stateInfo; thisObj.HandleTimer(); } private static Lazy&lt;System.Windows.Threading.Dispatcher&gt; _dispatchObject = new Lazy&lt;System.Windows.Threading.Dispatcher&gt;(() =&gt; { if (Application.Current != null) { return Application.Current.Dispatcher; } else { return null; } }); public static void Invoke(Action action) { if (_dispatchObject.Value == null || _dispatchObject.Value.CheckAccess()) { action(); } else { _dispatchObject.Value.Invoke(action); } } } private class ExampleUsage { /// &lt;summary&gt; /// shows how to create a event delayer and use it to listen to the events from a text box and call if no further changes for 2 seconds. /// &lt;/summary&gt; private static void ShowUsage(System.Windows.Controls.TextBox textBox) { EventDelayer eventDelayer = new EventDelayer(TimeSpan.FromSeconds(2)); textBox.TextChanged += eventDelayer.Enqueue; eventDelayer.DelayedEvent += eventDelayer_DelayedEvent; } /// &lt;summary&gt; /// redo search here. if required you can access the event args originally raised from the textbox through the event args of this method /// &lt;/summary&gt; static void eventDelayer_DelayedEvent(object sender, EventDelayer.DelayedEventArgs e) { foreach (var eventInfo in e) { var originalSender = eventInfo.Sender; var args = eventInfo.EventArgs; var timeInitiallyCalled = eventInfo.EventTime; } } } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload