Aktualisieren der Benutzeroberfläche von Ereignissen mit asyc await

Aktualisieren der Benutzeroberfläche von Ereignissen mit asyc await

Der async Muster unterstützt Fortschrittsaktualisierungen.

Kurz gesagt, Ihre async Methode kann einen IProgress<T> annehmen , und Ihr aufrufender Code übergibt eine Implementierung dieser Schnittstelle (normalerweise Progress<T> ).

public class ProcessWithUpdates
{
  public async Task Run(IProgress<string> progress)
  {
    await Task.Run(() =>
    {
      for (int i = 0; i < 10; i++)
      {
        if (progress != null)
          progress.Report(String.Format("Update {0}", i));
        Thread.Sleep(500);
      }
    });
  }
}

// calling code
ProcessWithUpdates pwp = new ProcessWithUpdates();
await pwp.Run(new Progress<string>(pwp_StatusUpdate));

Sie sollten Invoke verwenden Methode von Control . Es führt Code im Thread von Control aus. Sie können auch InvokeRequired überprüfen -Eigenschaft, um zu prüfen, ob Sie Invoke aufrufen müssen -Methode (es prüft, ob sich der Aufrufer in einem anderen Thread befindet als dem, in dem das Steuerelement erstellt wurde).

Einfaches Beispiel:

void SomeAsyncMethod()
{
    // Do some work             

    if (this.InvokeRequired)
    {
        this.Invoke((MethodInvoker)(() =>
            {
                DoUpdateUI();

            }
        ));
    }
    else
    {
        DoUpdateUI();
    }
}

void DoUpdateUI()
{
    // Your UI update code here
}

In einigen Fällen sollten Sie den IsHandleCreated überprüfen Eigentum von Control bevor Sie Invoke aufrufen Methode. Wenn IsHandleCreated gibt false zurück, dann müssen Sie warten, während das Handle von Control erstellt wird