Laden...

Ein Delegate Aufruf für zwei Steuerelemente?

Erstellt von macke_a vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.225 Views
M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 14 Jahren
Ein Delegate Aufruf für zwei Steuerelemente?

Hallo!
Um zwei Steuerelemente (Label1 & Label2) mit neuen Inhalten zu beschreiben, verwende ich zur Zeit den folgenden delegate Aufruf:

private delegate void SetTextCallString(string Text);
public void SetTextCall(string Text)
{
    if ((Label1.InvokeRequired) || (Label2.InvokeRequired))
    {
        Label1.Invoke(new SetTextCallString(SetTextCall), new object[] { Text });
    }
    else
    {
       Label1.Text = Text;
       Label2.Text = Text;
    }
}

Per InvokeRequired prüfe ich ob bei Label1 und Label2 ein Invoke nötig ist, falls ja mache ein Invoke, allerdings nur für Label1 und rufe die Funktion nochmal auf.

Wäre es besser für jedes Label einen delegate Aufruf zu schreiben?
Falls ich Invoke benötige, wäre es doch auf jeden Fall sinnvoll separate delegate Methoden zu deklarieren, da ich auch unterschiedliche Steuerelemente habe, oder was ist eure Meinung dazu?

Freue mich auf Eure Antworten.

Gruss

M
334 Beiträge seit 2007
vor 14 Jahren

Das brauchst du eigentlich gar nicht. Für die Prüfung auf InvokeRequired und den Invoke-Aufruf selbst kannst du jedes beliebige Control benutzen (sofern es im GUI-Thread erzeugt wurde, aber davon gehe ich aus 😁 )

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 14 Jahren

Es geht ausschliesslich um Controls die sich im GUI Thread befinden.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo macke_a,

das Control bei Control.InvokeRequired bzw. bei Control.Invoke dient ja nur dazu zu ermitteln, ob bzw. in welchem Thread gewechselt werden muss. Da ist jedes Control gleich gut, solange alle im gleichen Thread laufen. Du kannst z.B. auch immer das Form verwenden. Entsprechend brauchst und solltest du InvokeRequired auch nur einmal abfragen.

herbivore

5.299 Beiträge seit 2008
vor 14 Jahren

Hi macke_a!

k.A., was eigentlich du mit 2 Delegaten genau meintest. Für Invoking kann man eigentlich immer die generischen Delegaten Action<T> nehmen, braucht man keine neuen zu erfinden.
Generell tätich vieles Invoken vermeiden, weil Control.Invoke ist voll langsam.
Vllt. gefällt dir auch [ExtensionMethods] CrossThread-Calls, damit kommt man den meisten Gui-Blockade-Problemen bei.

Der frühe Apfel fängt den Wurm.

M
macke_a Themenstarter:in
291 Beiträge seit 2007
vor 14 Jahren

Moin!

@ErfinderDesRades

k.A., was eigentlich du mit 2 Delegaten genau meintest.

In meinem SetTextCall rufe ich Label1 und Label2 auf. Es wäre auch denkbar, dass ich für jedes Label einen eigenen delegate Aufruf erzeuge.

Quasi folgendermaßen:

private delegate void SetTextCallString1(string Text);
public void SetTextCall1(string Text)
{
    if (Label1.InvokeRequired) 
    {
        Label1.Invoke(new SetTextCallString1(SetTextCall1), new object[] { Text });
    }
    else
    {
       Label1.Text = Text;
    }
}

private delegate void SetTextCallString2(string Text);
public void SetTextCall2(string Text)
{
    if (Label2.InvokeRequired)
    {
        Label2.Invoke(new SetTextCallString2(SetTextCall2), new object[] { Text });
    }
    else
    {
       Label2.Text = Text;
    }
}

Wäre es besser für jedes Label einen delegate Aufruf zu schreiben und den Aufruf im Quelltext hintereinander zu schreiben?

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo macke_a,

deine Frage wurde ausreichend beantwortet. Die Lösung steht oben.

herbivore