18 Stimmen

Ersetzen des Kesselschilds - ist dieser Code irgendwie schlecht?

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 {};

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X