Announcement

Collapse
No announcement yet.

InvokeRequired-Beispiel aus MSDN

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • InvokeRequired-Beispiel aus MSDN

    Hallo,

    ich stehe gerade furchtbar auf dem Schlauch. In der MSDN gibt es ein "Code-Beispiel", welches ich nicht ganz nachvollziehen kann.

    Ich komme sonst ganz gut mit Eventhandlern klar, aber diese Beschreibung kann ich nicht umsetzen.

    Hier die Anleitung aus der MSDN:

    Fügen Sie in der workflowRuntime_WorkflowCompleted-Methode in der MainForm-Klasse eine If-Anweisung hinzu, um zu überprüfen, ob InvokeRequired für das TextBox-Steuerelement für Ergebnisse true ergibt.


    Rufen Sie in der true-Verzweigung der If-Anweisung die Invoke-Methode aus dem TextBox-Steuerelement für Ergebnisse auf, und übergeben Sie einen neuen generischen EventHandler des WorkflowCompletedEventArgs-Typs mit der Bezeichnung workflowRuntime.WorkflowCompleted.

    Übergeben Sie dem Ereignishandler als Parameter sender und die lokale e-Variable.


    Hier mein kläglicher Versuch, dem nachzukommen:

    Code:
    void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
            {
                if (this.result.InvokeRequired)
                {
                    EventHandler<WorkflowCompletedEventArgs> workflowRuntime_WorkflowCompleted = new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);
    
                    this.result.Invoke(new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted));
                }
                else
    	        {
                    //Rückgabe
    	        }
            }

    Zur Erklärung:
    "Result" ist der Name der Textbox. Es gibt ein Event "workflowRuntime.WorkflowCompleted" welches wie folgt mit der oben stehenden Methode verknüpft ist:
    Code:
    workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);

    Hier der Artikel in der MSDN:
    http://msdn.microsoft.com/de-de/library/ms734785.aspx


    Kann mir bitte jemand helfen, diese Beschreibung in einen Codeschnipsel umzuwandeln?

    Danke
    Theo Fontane

  • #2
    Hallo,

    [highlight=c#]
    private void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)
    {
    if (resultTextBox.InvokeRequired)
    {
    // Argumente für den Methodenaufruf per Delegaten:
    object[] arguments = { sender, e };

    // Delegat:
    Action<object, WorkflowCompletedEventArgs> del = workflowRuntime_WorkflowCompleted;

    // Invoken:
    resultTextBox.Invoke(del, arguments);
    }
    else
    {
    resultTextBox.Text = e.Properties["Result"].ToString();

    // ...
    }
    }
    [/highlight]

    Kurze Erklärung:
    GUI-Elemente können nur vom GUI-Thread aktualisiert werden. Mit InvokeRequired wird geprüft ob die Anforderung von einem anderen Thread stammt. Wenn ja dann wird dieselbe Methode per Delegate im UI-Thread aufgerfuen, falls nein kann die Aktualisierung direkt durchgeführt werden. Durch Invoke wird somit der else-Teil durchgeführt.

    Edit: In der Originalversion (die englische) ist es sogar mit Beispiel erklärt. Siehe auch dort bzw:
    [highlight=c#]
    if (this.result.InvokeRequired)
    {
    this.result.Invoke(new EventHandler<WorkflowCompletedEventArgs>
    (this.workflowRuntime_WorkflowCompleted), sender, e);
    }
    [/highlight]
    Anmerkung: Es ist egal ob EventHandler<T> oder Action<T1, T2> verwendet wird. Beide sind nur Delegat-Deklarationen die die Arbeit erleichtern.

    mfG Gü

    PS: Schlecht gemachtes Beispiel in der MSDN. Es wäre kein Aufwand gewesen diesen Code dort hinzuzufügen (oder als Download) - aber das ist halt Mircosoft.
    Zuletzt editiert von gfoidl; 20.08.2009, 12:31.
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Danke für die rasche Antwort. Was ein Invoke macht und warum man ihn braucht, weiß ich - mich hat vor allem folgende Zeile total aus dem Konzept gebracht:

      und übergeben Sie einen neuen generischen EventHandler des WorkflowCompletedEventArgs-Typs mit der Bezeichnung workflowRuntime.WorkflowCompleted.
      AFAIK darf man Variablen nicht mit Punkten benennen und da es bereits einen Event gibt, der GENAU SO heißt, habe ich angenommen, dass da noch etwas Besonderes getrickst werden muss.

      Vermutlich hast du aber recht und der Artikel wurde einfach nur schlampig geschrieben.

      Vielen Dank!

      Theo Fontane

      Comment


      • #4
        Vermutlich hast du aber recht und der Artikel wurde einfach nur schlampig geschrieben.
        Schlampig übersetzt. Im englischen original steht da noch ein Unterstrich anstatt einem Punkt. Wenn du der englischen Sprachen auch nur halbwegs mächtig bist solltest du das Original immer vorziehen. Die ist üblicherweise von jemanden mit
        technischem Sachverstand geschrieben. Bei der Übersetzung kann man sich da nicht mehr sicher sein (wenn sie denn manuell übersetzt ist und nicht wie ein Großteil der MSDN nur automatisch).

        Comment

        Working...
        X