Aufräumen von Code mit InvokeRequired

Ich weiß, dass, wenn die Manipulation von UI-Steuerelemente aus beliebigen nicht-UI-thread, müssen Sie marshal Ihre Aufrufe im UI-thread, um Probleme zu vermeiden. Der Allgemeine Konsens ist, dass Sie verwenden sollten InvokeRequired testen, und wenn es true ist, verwenden .Aufrufen, um führen Sie das Marshalling.

Dies führt zu einer Menge von code, der wie folgt aussieht:

private void UpdateSummary(string text)
{
    if (this.InvokeRequired)
    {
        this.Invoke(new Action(() => UpdateSummary(text)));
    }
    else
    {
        summary.Text = text;
    }
}

Meine Frage ist: kann ich weglassen, die InvokeRequired testen und einfach anrufen, Aufrufen, etwa so:

private void UpdateSummary(string text)
{
    this.Invoke(new Action(() => summary.Text = text));
}

Gibt es ein problem dabei? Wenn ja, gibt es einen besseren Weg, um den InvokeRequired testen, zwar nicht mit kopieren und einfügen dieses Muster ganz über dem Platz?

Kommentar zu dem Problem - Öffnen
Es sollte ziemlich doggone selten, dass Sie code haben, der von einem thread, der könnte auch ausgeführt werden, auf dem UI-thread. Ja, nicht die Mühe InvokeRequired testen, wenn Sie bekam Lambda-Ausdrücke zur Verfügung. Kommentarautor: Hans Passant
@Hans - ich weiß nicht, ich arbeite in der Steuerungstechnik, und ich habe code, der dies tut. Ich habe oft eine Reihe von threads, die beim asynchronen Vorgänge, die, zusätzlich zu den UI-thread ist, können Sie Anrufe tätigen, um gemeinsame Protokollierung, Anzeige aktualisiert, oder die Aufrufe zum Stopp der globalen Prozess. Jeder thread behandelt einen anderen Aspekt des Prozesses, aber Sie haben auch Zugriff auf bestimmte Kern-Methoden, die Sie rufen durch Rufen. Da eine lokale Betreiber muss auch Zugang zu vielen dieser Methoden über die Benutzeroberfläche, die Sie am Ende teilen eine Menge von code. Kommentarautor: J...
InvokeRequired ist nur für die Benutzeroberfläche, verwenden Sie es nicht für irgendetwas anderes. Gemeinsame Protokollierung erfordert nur eine Sperre. In soft real-time Programme, versteckt sich der context-switch in eine helper-Methode ist eine ziemlich gefährliche anti-pattern. Kommentarautor: Hans Passant
Die Protokollierung in eine Datei, ja, aber wenn auch die Protokollierung auf dem Bildschirm oder das hinzufügen von Elementen zu einem Listenfeld dann wird es ein UI-Problem. Viele dieser Maßnahmen sind alle Teil des ganzen Verfahren, wie gut. Während es machen kann, haben die worker-threads stößt, die durch Sie und rufen Sie line-by-line benötigt, die meiste Zeit ist es einfacher, lassen Sie den UI-thread beschäftigen sich mit Ihnen - lassen Sie die Arbeitnehmer delegieren, die ganze Sache, und Holen Sie auf mit Ihren zeitkritischen Operationen. Punkt ist, es ist kein Unmögliches Szenario. Kommentarautor: J...
Das ist ziemlich viel, das Boot, die ich in. Ich landete nicht mit dem helper I 'akzeptiert' auf, und einfach gehalten, die InvokeRequired-tests. Kommentarautor: Erik Forbes

InformationsquelleAutor der Frage Erik Forbes | 2010-10-06

Schreibe einen Kommentar