webentwicklung-frage-antwort-db.com.de

Was genau passiert als async-Methode, ohne ein Schlüsselwort zu erwarten?

Ich habe einen Webserver und es wird regelmäßig ein Job zusammengeführt und Datensätze (viele Anforderungsprotokolle) gesendet. 

Task.Run(() =>
{
    while (true)
    {
        try
        {
            MergeAndPutRecords();
        }
        catch (Exception ex)
        {
            Logger.Error(ex);
        }
    }
});

In der MergeAndPutRecords-Funktion gibt es Code, der Datensätze zusammenführt, und die async-Funktion gibt den Task zurück, der Datensätze sendet. (Eigentlich ist es Amazon Kinesis Firehoses PutRecordBatchAsync .)

Was passiert dann, wenn ich diese Funktion ohne Abwarten des Schlüsselworts aufrufe? Läuft die Funktion auf einem separaten Thread? Hier sagt es nicht . Was gibt dann die Task-Mittel zurück? Hier sagt eine asynchrone Methode ohne zu erwartende Schlüsselwortmittel 

  1. Startet die asynchrone Methode im aktuellen Thread. Ignoriert alle Ergebnisse (einschließlich Ausnahmen).

Dann werden mein periodischer Job und PutRecordBatchAsync gleichzeitig verarbeitet. Ich weiß, asynchronous und gleichzeitig ist anders. Es gibt jedoch kein erwartetes Keyword und sie befinden sich im selben Thread. Welches würde zuerst ausgeführt werden? Ich bin verwirrend...

Es gibt gewaltige Datensätze, die zusammengeführt und in Echtzeit gesendet werden müssen. Ich denke, es muss gleichzeitig ausgeführt werden.

7
YB Yu

Dann werden mein periodischer Job und PutRecordBatchAsync gleichzeitig verarbeitet.

Mithilfe der Task-API können Sie sicherstellen, dass sie gleichzeitig ausgeführt werden (mithilfe eines Thread-Pools). Sie müssen jedoch den Unterschied zwischen parallelen Vorgängen des Arbeitsspeichers Vs IO verstehen.

Während die Parallelität im Arbeitsspeicher von der Verwendung von Tasks profitiert, benötigt der Aufruf von IO nach der Ausführung keinen Thread, da er auf die Parallelität der Hardware angewiesen ist. Wenn er den Thread jemals verwendet, muss er auf das IO Rückruf, wodurch die kostbaren Systemressourcen verschwendet und die Skalierbarkeit des Systems reduziert wird

In diesem Fall ist die Parallelität IO, wenn Sie eine remote/netzwerkbasierte API aufrufen. Wie hilft hier Async-await?

Nun, der Async-Vorgang gibt den Thread-Kontext frei. In Windows würde er IO Completion-Port (Warteschlangenmechanismus) verwenden, um den Async-Aufruf auszuführen, während der aufrufende Thread zum Abrufen anderer ähnlicher Aufrufe verwendet wird context bei Rückkehr des IO - Aufrufs zum Bereitstellen der Antwort und auch für diesen Fall, wenn es kein UI-Aufruf ist, verwenden Sie ConfigureAwait(false), damit der Thread-Kontext zur Übermittlung der Antwort verwendet werden kann.

Was ist, wenn Sie nicht mit Async warten erwarten?

Der Aufruf, der asynchron sein soll, wird synchron und hat sofort Auswirkungen auf die Skalierbarkeit des Systems, da Threads jetzt blockiert werden, was bei lang andauernden IO - Operationen noch schlimmer ist. Haben Sie gesehen, wie JavaScript-Frameworks immer einen AJAX (Async) -Aufruf an die Server-API ausführen, so dass viel mehr Arbeit möglich ist, ohne die Browser-Threads zu blockieren.

Bei der Speicherverarbeitung würden Sie im Allgemeinen eine bestimmte Anzahl von Tasks erstellen und diese mit Task.WaitAll oder Parallel.ForEach für eine Auflistung verarbeiten. Für die asynchrone Verarbeitung wird empfohlen, Task.Run nirgends zu verwenden, da Async vom Einstiegspunkt aus bevorzugt wird Bei MVC können Controller asynchron sein. Mehrere Anrufe werden mithilfe von Task.WhenAll-Repräsentationsaufgabe gruppiert und dann darauf gewartet. Selbst wenn Sie Task.Run wie in Ihrem Code verwenden, verwenden Sie async lambda, um einen asynchronen Aufruf auszuführen

Zusammenfassung :

Die Verwendung von await für asynchrone Aufrufe ist obligatorisch, andernfalls ist das async-Schlüsselwort in diesem Kontext unbrauchbar, und yes await wartet auf die Rückkehr des IO - Aufrufs, bevor die Fortsetzung ausgeführt wird, obwohl kein Thread im Prozess blockiert ist

7
Mrinal Kamboj

Wenn eine Methode eine Task zurückgibt, ist es immer ratsam, das Ergebnis dieser Task irgendwann zu beobachten. Es kann sich um den deklarierten Rückgabewert oder um eine Ausnahme handeln. Wenn Sie diese Aufgabe beobachten möchten, bevor Ihre Methode fortgesetzt wird, ist await die Empfehlung.

In diesem Fall sollten Sie wahrscheinlich das Ergebnis der von Task zurückgegebenen PutRecordBatchAsync beobachten. Sie möchten wissen, ob der Anruf aus irgendeinem Grund fehlgeschlagen ist, da dies wahrscheinlich darauf hinweist, dass Ihre Datensätze nicht gespeichert wurden!

In dem von Ihnen angegebenen Beispielcode werden Sie feststellen, dass Sie nachfolgende Aufrufe von MergeAndPutRecords durchführen, bevor der vorherige Aufruf abgeschlossen ist. Sind Sie sicher, dass dies beabsichtigt ist?

0
Gusdor