Ich habe vor kurzem diese beiden (unverbundenen) Methoden erstellt, um eine Menge von Boiler-Plate-Code in meiner Winforms-Anwendung zu ersetzen. Soweit ich sagen kann, funktionieren sie ok, aber ich brauche einige Beruhigung/Ratschläge, ob es einige Probleme gibt, die ich übersehen könnte.
(aus dem Gedächtnis)
static class SafeInvoker
{
//Utility to avoid boiler-plate InvokeRequired code
//Usage: SafeInvoker.Invoke(myCtrl, () => myCtrl.Enabled = false);
public static void Invoke(Control ctrl, Action cmd)
{
if (ctrl.InvokeRequired)
ctrl.BeginInvoke(new MethodInvoker(cmd));
else
cmd();
}
//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void RaiseEvent(object sender, EventHandler evnt)
{
var handler = evnt;
if (handler != null)
handler(sender, EventArgs.Empty);
}
}
EDIT: Siehe dazugehörige Frage aquí
アップデイト
In Anknüpfung an Deadlock-Probleme (im Zusammenhang mit diese Frage ), habe ich von Invoke zu BeginInvoke gewechselt (siehe eine Erklärung aquí ).
Ein weiteres Update
Bezüglich des zweiten Schnipsels neige ich immer mehr dazu, das "empty delegate"-Muster zu verwenden, das dieses Problem "an der Quelle" behebt, indem das Ereignis direkt mit einem leeren Handler deklariert wird, etwa so:
event EventHandler MyEventRaised = delegate {};