Schnellstart: Abrufen asynchroner APIs in C# oder Visual Basic

Applies to Windows and Windows Phone

Die Windows-Runtime enthält viele asynchrone APIs. Diese sorgen dafür, dass Ihre App reaktionsfähig bleibt, wenn sie für eine längere Zeit mit einer Aufgabe beschäftigt ist. Das bedeutet, dass Ihre App nicht erst auf den Abschluss umfangreicher Vorgänge warten muss, um die Ausführung fortzusetzen. Beispielsweise muss eine App, die Infos aus dem Internet herunterlädt, vielleicht mehrere Sekunden warten, bis die Infos übermittelt sind. Wenn Sie die Infos mit einer synchronen Methode abrufen, ist die App solange blockiert, bis der Methodenaufruf beendet ist. In diesem Zeitraum reagiert die App nicht auf Benutzerinteraktionen, und da sie nicht zu antworten scheint, ist der Benutzer möglicherweise verärgert. Die Windows-Runtime stellt asynchrone APIs bereit, damit Ihre App für den Benutzer reaktionsfähig bleibt, wenn sie lange Vorgänge ausführt.

Die meisten asynchronen APIs in der Windows-Runtime haben kein synchrones Gegenstück. Sie müssen daher unbedingt verstehen, wie Sie die asynchronen APIs mit C# oder Microsoft Visual Basic in Ihrer Windows-Runtime-App verwenden können. Hier erfahren Sie, wie Sie die asynchronen APIs der Windows-Runtime aufrufen können.

Roadmap: Wie hängt dieses Thema mit anderen zusammen? Siehe:

Voraussetzungen

Siehe Erstellen Ihrer ersten Windows-Runtime-App mit C# oder Visual Basic.

Verwenden asynchroner APIs

Üblicherweise erhalten asynchrone Methoden Namen, die auf "Async" enden. Asynchrone APIs werden in der Regel als Reaktion auf eine Benutzeraktion aufgerufen – beispielsweise, wenn der Benutzer auf eine Schaltfläche klickt. Der Aufruf einer asynchronen Methode in einem Ereignishandler ist eine der einfachsten Möglichkeiten, asynchrone APIs zu verwenden. Hier verwenden wir den await-Operator als Beispiel.

Angenommen, Sie haben eine App, die den Titel von Blogbeiträgen aus einem bestimmten Ort auflistet. Die App hat ein Button-Element, auf das der Benutzer klickt, um die Titel abzurufen. Die Titel werden in einem TextBlock-Element angezeigt. Wenn der Benutzer auf die Schaltfläche klickt, ist es wichtig, dass die App reaktionsfähig bleibt, während sie auf Infos von der Website des Blogs wartet. Um diese Reaktionsfähigkeit sicherzustellen, stellt die Windows-Runtime eine asynchrone Methode (SyndicationClient.RetrieveFeedAsync) zum Herunterladen des Feeds bereit.

Im Beispiel hier wird durch Aufrufen der asynchronen Methode SyndicationClient.RetrieveFeedAsync die Liste der Blogbeiträge abgerufen. Dies ist die einfachste Möglichkeit zum Aufrufen einer asynchronen Methode.


// Put the keyword, async on the declaration of the event handler.
private async void Button_Click_1(object sender, RoutedEventArgs e)
{

    Windows.Web.Syndication.SyndicationClient client = new SyndicationClient();

    // Force the SyndicationClient to download the information.
    client.BypassCacheOnRetrieve = true;

    Uri feedUri
        = new Uri("http://windowsteamblog.com/windows/b/windowsexperience/atom.aspx");

    try
    {
        // Call SyndicationClient RetrieveFeedAsync to download the list of blog posts.
        SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri);

        // The rest of this method executes after await RetrieveFeedAsync completes.
        rssOutput.Text = feed.Title.Text + Environment.NewLine;

        foreach (SyndicationItem item in feed.Items)
        {
            rssOutput.Text += item.Title.Text + ", " +
                             item.PublishedDate.ToString() + Environment.NewLine;
        }
    }
    catch (Exception ex)
    {
        // Log Error.
        rssOutput.Text =
            "I'm sorry, but I couldn't load the page," +
            " possibly due to network problems." +
            "Here's the error message I received: "
            + ex.ToString();
    }
}


Zu diesem Beispiel gibt es eine Reihe wichtiger Dinge anzumerken. Zunächst verwendet die Zeile SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) den await-Operator mit dem Aufruf der asynchronen Methode RetrieveFeedAsync. Der await-Operator teilt dem Compiler gewissermaßen mit, dass Sie eine asynchrone Methode aufrufen, und der Compiler erledigt dann etwas zusätzliche Arbeit für Sie. Als Nächstes enthält die Deklaration des Ereignishandlers das Schlüsselwort async. Dieses Schlüsselwort muss in der Methodendeklaration aller Methoden angegeben werden, in denen Sie den await-Operator verwenden. Für die Button.Click-Ereignishandlersignatur wäre das Schlüsselwort async nicht erforderlich. async wurde hinzugefügt, damit im Hauptteil des Handlers asynchrone Methoden aufgerufen werden können. Weitere Informationen zum Behandeln von Eingabeereignissen sowie zum Ausführen await-fähiger Methoden dieser Ereignisse finden Sie unter Übersicht über Ereignisse und Routingereignisse.

In diesem Thema werden wir uns nicht ausführlicher damit beschäftigen, was der PC mit dem await-Operator anstellt. Wir sehen uns aber an, was Ihre App macht, damit sie asynchron und reaktionsfähig ist. Überlegen Sie, was geschieht, wenn Sie synchronen Code verwenden. Angenommen, es gibt eine Methode namens SyndicationClient.RetrieveFeed, die synchron ist. (So eine Methode gibt es nicht, aber wir stellen es uns einfach mal vor.) Wenn Ihre App anstelle von SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri) die Zeile SyndicationFeed feed = client.RetrieveFeed(feedUri) enthält, wird die Ausführung der App beendet, bis der Rückgabewert von RetrieveFeed verfügbar ist. Und während Ihre App darauf wartet, dass die Methode abgeschlossen wird, kann sie nicht auf andere Ereignisse reagieren, z. B. ein weiteres Click-Ereignis. Ihre App wäre also blockiert, bis RetrieveFeed zurückkehrt.

Rufen Sie aber client.RetrieveFeedAsync auf, initiiert die Methode den Abruf und kehrt sofort zurück. Wenn Sie await mit RetrieveFeedAsync verwenden, beendet die App den Ereignishandler vorübergehend. Sie kann dann die anderen Ereignisse verarbeiten, während RetrieveFeedAsync asynchron ausgeführt wird. Hierdurch bleibt die App für den Benutzer reaktionsfähig. Wenn RetrieveFeedAsync abgeschlossen und SyndicationFeed verfügbar ist, macht die App im Ereignishandler im Grunde an der Stelle weiter, wo sie aufgehört hat, und zwar nach SyndicationFeed feed = await client.RetrieveFeedAsync(feedUri), und beendet den Rest der Methode.

Das Schöne am Verwenden des await-Operators ist, dass der Code nicht viel anders aussieht, als wenn Sie die imaginäre RetrieveFeed-Methode verwendet hätten. Es ist möglich, asynchronen Code in C# oder Visual Basic ohne den await-Operator zu schreiben, aber der resultierende Code neigt dazu, die Funktionsweise der asynchronen Ausführung zu betonen. Asynchroner Code ist deshalb kompliziert zu schreiben, zu verstehen und zu verwalten. Durch Verwenden des await-Operators können Sie die Vorteile einer asynchronen App nutzen, ohne den Code zu komplex zu gestalten.

Rückgabetypen und Ergebnisse asynchroner APIs

Wenn Sie dem Link zu RetrieveFeedAsync gefolgt sind, haben Sie vielleicht festgestellt, dass der Rückgabetyp von RetrieveFeedAsync kein SyndicationFeed ist. Stattdessen lautet der Rückgabetyp wie folgt: IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress>. Aus der Perspektive der Rohsyntax gibt eine asynchrone API ein Objekt mit dem darin enthaltenen Ergebnis zurück. Während es üblich und mitunter sinnvoll ist, sich eine asynchrone Methode als "awaitable" vorzustellen, agiert der await-Operator tatsächlich auf der Grundlage des Rückgabewerts und nicht auf der Grundlage der Methode. Wenn Sie den await-Operator anwenden, erhalten Sie das Ergebnis der asynchronen Methoden. Genauer gesagt: Sie erhalten das Ergebnis des Aufrufs von GetResult für das Objekt, das Sie in der Rohsyntax sehen. In diesem Beispiel ist SyndicationFeed das Ergebnis von RetrieveFeedAsync.

Wenn Sie eine asynchrone Methode verwenden, können Sie sich den Rückgabetyp ansehen, um Infos zum Ergebnis zu erhalten. Alle asynchronen APIs in der Windows-Runtime geben einen der folgenden Typen zurück:

Der Ergebnistyp einer asynchronen Methode entspricht dem Typ des Parameters TResult. Typen ohne TResult haben kein Ergebnis. Sie können sich das Ergebnis als void vorstellen. In Visual Basic entspricht eine Sub-Prozedur einer Methode mit einem void-Rückgabetyp.

Die Tabelle hier enthält Beispiele asynchroner Methoden und listet den Rückgabetyp und den Ergebnistyp jeder Methode auf.

Asynchrone MethodeRückgabetypErgebnistyp
SyndicationClient.RetrieveFeedAsync IAsyncOperationWithProgress<SyndicationFeed, RetrievalProgress> SyndicationFeed
FileOpenPicker.PickSingleFileAsync IAsyncOperation<StorageFile> StorageFile
XmlDocument.SaveToFileAsync IAsyncAction void
InkStrokeContainer.LoadAsync IAsyncActionWithProgress<UInt64> void
DataReader.LoadAsync DataReaderLoadOperation, eine benutzerdefinierte Ergebnisklasse, die IAsyncOperation<UInt32> implementiert UInt32

 

In .NET for Windows Runtime apps definierte asynchrone Methoden besitzen den Rückgabetyp Task oder Task<TResult>. Methoden, die Task zurückgeben, ähneln den asynchronen Methoden in der Windows-Runtime, die IAsyncAction zurückgeben. In jedem Fall ist das Ergebnis der asynchronen Methode void. Der Rückgabetyp Task<TResult> gleicht IAsyncOperation<TResult> dahingehend, dass es sich beim Ergebnis der asynchronen Methode um den gleichen Typ handelt wie beim TResult-Typparameter. wenn die Aufgabe ausgeführt wird. Weitere Informationen zum Verwenden von .NET for Windows Runtime apps und Aufgaben finden Sie unter Übersicht über .NET für Windows-Runtime-Apps.

Behandeln von Fehlern

Wenn Sie Ihre Ergebnisse mit dem await-Operator aus einer asynchronen Methode abrufen, können Sie mit einem try/catch-Block auf die gleiche Weise wie bei synchronen Methoden Fehler behandeln, die in asynchronen Methoden auftreten. Im vorherigen Beispiel werden die RetrieveFeedAsync-Methode und der await-Vorgang zur Fehlerbehandlung beim Auslösen einer Ausnahme in einen try/catch-Block eingeschlossen.

Werden asynchrone Methoden von anderen asynchronen Methoden aufgerufen, wird jede Methode, die zu einer Ausnahme führt, an die äußeren Methoden weitergegeben. Folglich können Sie die äußerste Methode mit einem try/catch-Block versehen, um Fehler für die geschachtelten asynchronen Methoden abzufangen. Auch hier werden Ausnahmen ähnlich wie bei synchronen Methoden erfasst. await kann jedoch nicht im catch-Block verwendet werden.

Zusammenfassung und nächste Schritte

Das Muster für den Aufruf einer asynchronen Methode, das wir hier zeigen, ist am einfachsten zu verwenden, wenn Sie asynchrone APIs in einem Ereignishandler aufrufen. Sie können dieses Muster auch verwenden, wenn Sie eine asynchrone Methode in einer überschriebenen Methode aufrufen, die void oder Sub in Visual Basic zurückgibt.

Beachten Sie bei der Arbeit mit asynchronen Methoden in der Windows-Runtime bitte Folgendes:

  • Üblicherweise erhalten asynchrone Methoden Namen, die auf "Async" enden.
  • Methoden, die den await-Operator verwenden, müssen mit dem async-Schlüsselwort markiert sein.
  • Wenn eine App den await-Operator findet, bleibt die App bei einer Benutzerinteraktion reaktionsfähig, während die asynchrone Methode ausgeführt wird.
  • Eine asynchrone Methode gibt ein Objekt zurück, das das Ergebnis enthält. In den meisten Fällen ist das Ergebnis des Rückgabewerts sinnvoll, nicht der Rückgabewert selbst. Sie finden den Ergebnistyp, indem Sie sich den Rückgabetyp ansehen.
  • Mithilfe asynchroner APIs und async-Strukturen lässt sich häufig die Leistung Ihrer App verbessern. Weitere Informationen zum Verbessern der Leistung mithilfe von asynchronen APIs finden Sie unter Aufrechterhalten der Reaktionsfähigkeit des UI-Threads. Dieses Thema behandelt explizit die Implementierung als Task, um eine asynchrone Logik zu erhalten.

Das Beispiel in diesem Thema gibt Text aus, der wie folgt aussieht.

Windows Experience Blog
PC Snapshot: Sony VAIO Y, 8/9/2011 10:26:56 AM -07:00
Tech Tuesday Live Twitter #Chat: Too Much Tech #win7tech, 8/8/2011 12:48:26 PM -07:00
Windows 7 themes: what’s new and what’s popular!, 8/4/2011 11:56:28 AM -07:00
PC Snapshot: Toshiba Satellite A665 3D, 8/2/2011 8:59:15 AM -07:00
Time for new school supplies? Find back-to-school deals on Windows 7 PCs and Office 2010, 8/1/2011 2:14:40 PM -07:00
Best PCs for blogging (or working) on the go, 8/1/2011 10:08:14 AM -07:00
Tech Tuesday – Blogging Tips and Tricks–#win7tech, 8/1/2011 9:35:54 AM -07:00
PC Snapshot: Lenovo IdeaPad U460, 7/29/2011 9:23:05 AM -07:00
GIVEAWAY: Survive BlogHer with a Sony VAIO SA and a Samsung Focus, 7/28/2011 7:27:14 AM -07:00
3 Ways to Stay Cool This Summer, 7/26/2011 4:58:23 PM -07:00
Getting RAW support in Photo Gallery & Windows 7 (…and a contest!), 7/26/2011 10:40:51 AM -07:00
Tech Tuesdays Live Twitter Chats: Photography Tips, Tricks and Essentials, 7/25/2011 12:33:06 PM -07:00
3 Tips to Go Green With Your PC, 7/22/2011 9:19:43 AM -07:00
How to: Buy a Green PC, 7/22/2011 9:13:22 AM -07:00
Windows 7 themes: the distinctive artwork of Cheng Ling, 7/20/2011 9:53:07 AM -07:00

Verwandte Themen

Roadmap für Windows-Runtime-Apps mit C# oder Visual Basic
Aufgabenbasiertes asynchrones Muster (Task-based Asynchronous Pattern, TAP) – Whitepaper
Szenarien für Reversi-Beispielfeatures: Asynchroner Code

 

 

Anzeigen:
© 2014 Microsoft