Manchmal möchte man, dass ein EventHandler erst mit Verzögerung ausgelöst wird. Die Klasse ermöglicht diesen Fall für die Standardevents.
Einsatzbeispiel ist beispielsweise eine Datenbankabfrage mit Benutzereingaben. Will man, dass der Benutzer einen Namen eingeben kann, nach dem dann gesucht werden soll, möchte man nicht, dass bei jedem TextChange eine Datenbankabfrage gestartet wird, da der Benutzer wahrscheinlich noch weitere Zeichen eintippt. Mit dem DelayedEventHandler kann ein Zeitraum angegeben werden, der das Auslösen des Events verzögert. Tippt der Benutzer in dieser Zeit weiter, werden die vorherigen Events gestoppt und nur das letzte wird ausgelöst. Auf diese Weise wird nur eine Datenbankabfrage gestartet, wenn der Benutzer (aktuell) fertig ist.
public Form()
{
InitializeComponent();
textBox1.TextChanged += new DelayedEventHandler(
TimeSpan.FromMilliseconds(300),
(sender, e) =>
{
//Delegate als EventHandler
//Das Event wird erst aufgerufen, wenn der Text 300ms lang nicht geändert wurde.
}
).Delayed;
textBox2.TextChanged += new DelayedEventHandler(
TimeSpan.FromMilliseconds(300),
textBox_TextChanged
).Delayed;
}
private void textBox_TextChanged(object sender, EventArgs e)
{
//"normale" Funktion als EventHandler
//Das Event wird erst aufgerufen, wenn der Text 300ms lang nicht geändert wurde.
}
using System;
using System.Windows.Forms;
/// <summary>
/// Die Klasse ermöglicht es, dass ein Event erst mit Verzögerung ausgelöst wird.
/// Tritt das selbe Event in der angegeben Zeitspanne erneut auf, wird das vorherige Event gestoppt.
/// </summary>
public class DelayedEventHandler
{
private Timer timer;
/// <summary>
/// Ruft das Delay ab oder legt es fest.
/// </summary>
public int Delay
{
get { return this.timer.Interval; }
set { this.timer.Interval = value; }
}
/// <summary>
/// EventHandler, der an Events von Steuerelementen gebunden werden kann.
/// </summary>
public EventHandler Delayed { get; private set; }
private EventHandler handler;
private object forwardSender;
private EventArgs forwardArgs;
/// <summary>
/// Erzeugt einen DelayedEventHandler mit der angegebenen Zeitspanne.
/// </summary>
/// <param name="delay">Das Delay, mit dem...</param>
/// <param name="handler">...der gewünscht Handler aufgerufen wird.</param>
public DelayedEventHandler(TimeSpan delay, EventHandler handler)
: this((int)delay.TotalMilliseconds, handler)
{
}
/// <summary>
/// Erzeugt einen DelayedEventHandler mit der angegebenen Zeitspanne in Millisekunden.
/// </summary>
/// <param name="delayInMilliseconds">Das Delay in Millisekunden, mit dem...</param>
/// <param name="handler">...der gewünscht Handler aufgerufen wird.</param>
public DelayedEventHandler(int delayInMilliseconds, EventHandler handler)
{
timer = new Timer
{
Enabled = false,
Interval = delayInMilliseconds
};
timer.Tick += new EventHandler((s, e) =>
{
timer.Stop();
if (handler != null)
{
handler(this.forwardSender, this.forwardArgs);
}
});
this.handler = handler;
Delayed = new EventHandler((sender, e) =>
{
this.forwardSender = sender;
this.forwardArgs = e;
timer.Stop();
timer.Start();
});
}
}
Kommentare zum Snippet