2016-12-15 1 views
2

Ich lerne async und erwarte die Operation in C#. Ich konnte den Ablauf der Ausführung nicht verstehen, wenn mehrere asynchrone Operationen ausgeführt werden. für zB: Ich habe den folgenden Code in meiner C# -Anwendung.UnderstandingAync und erwarte in C#

await repository.GetAsync(values);//execute for 10 sec        
var result = repository.setAsync(data); //20 sec 
dataresult = await repository.GetAsync(result);//execute for 10 sec 

Ich habe drei async Anrufe hier.

Nach meinem Verständnis wird jeder Anruf einen Rückruf haben und dies wird nicht auf eine Aktion warten.

Also, wie kann ich sicherstellen, dass die Aktion abgeschlossen ist?

Das repository.setAsync wird vor dem repository.GetAsync (values) ausgeführt. oder dies wird erst nach der Ausführung von repository.GetAsync (Werte) ausgeführt?

Also, was wird die Reihenfolge der Ausführung sein?

1)

await repository.GetAsync(values);//started await method execution,since there is no callback it will not set and will start execute the next before complete this.        
    var result = repository.setAsync(data); //will execute for 20 sec. Once completed will go to previous thread and complete that. 

2)

await repository.GetAsync(values);//started await method execution,complete it and move to the next line. 
    var result = repository.setAsync(data); //will execute for 20 sec. 

Wenn Sie etwas synchron ausführen, Sie warten, bis es, bevor sie zu einer anderen Aufgabe zu beenden. Wenn Sie etwas asynchron ausführen, können Sie zu einer anderen Task wechseln, bevor sie beendet wird. Sie wartet jedoch darauf, dass die asynchrone Operation beendet wird. Warum dieser Widerspruch?

Ich möchte das Datenergebnis erst nach Abschluss der Operation zurückgeben. Ich fühle, dass dies im Gegensatz zu Feuer und vergessen ist. ob diese zwei gleiche oder unterschiedliche Konzepte sind? Wie nach dem unten angegebenen Link reference

Das await Schlüsselwort nicht den Faden nicht blockiert, bis die Aufgabe abgeschlossen ist.

Aber von den Antworten, die hier gepostet werden, habe ich verstanden, dass dies die Ausführung pausiert. was wahr ist? Verpasse ich etwas?

+0

Einfach gesagt: 'await' ist ein„asynchrone warten“, so dass die Methode * * wird warten, bis es abgeschlossen ist, aber das * Thread * ist nicht blockiert. Sie können mein [async Intro] (http://blog.stephencleary.com/2012/02/async-and-wait.html) hilfreich finden. –

Antwort

5

Nach meinem Verständnis wird jeder Anruf einen Rückruf haben und dies wird nicht auf eine Aktion warten.

Wenn Sie await verwenden, wird der Code für die Aktion abgeschlossen warten, bevor er auf. So behandeln Sie Datenabhängigkeiten - Situationen, in denen eine Aufgabe Ergebnisse einer vorherigen Aufgabe benötigt, bevor sie mit der Verarbeitung beginnen kann. Die einzige Aktion, die nicht erwartet wird, ist result, also GetAsync(result) muss Task<T> als Parameter übernehmen, wobei T der Typ ist, der SetAsync Methode zurückgibt.

Hinweis

Wenn Code nach dem await nicht auf dem UI-Thread ausgeführt werden müssen, sollten Sie ConfigureAwait(false) auf den Anruf Task erwarten Sie. Warum ist diese Best Practice? Stephen Cleary bietet eine ausgezeichnete blog post on the topic of async/await deadlocks, die es erklärt.

Es ist auch sehr wahrscheinlich, dass Sie await in der zweiten Zeile und eine Zuordnung von data in der ersten Zeile fehlen:

var data = await repository.GetAsync(values).ConfigureAwait(false); 
var result = await repository.SetAsync(data).ConfigureAwait(false); 
dataresult = await repository.GetAsync(result).ConfigureAwait(false); 

Also, was ist das Konzept des Rückrufs und Feuers und vergisst hier?

Wenn Rückruf geschieht vor dem Aufruf von await, was möglich ist, wenn Sie eine Aufgabe anwerfen, etwas anderes tun, und dann await diese Aufgabe, Sie bekommen eine Chance, mehr Arbeit zu tun in zwischen „Brennen und Vergessen“ und die Ergebnisse zurückbekommen. Der Schlüssel hier ist, dass es in der Mitte keine Datenabhängigkeit sein muss:

var dataTask = repository.GetAsyncOne(values); // Fire and forget 
// Do something else in the middle 
var result = await repository.SetAsync(data).ConfigureAwait(false); 
// If the task has completed, there will be no wait 
var data = await dataTask.ConfigureAwait(false); 
+0

Die einzige Aktion, die nicht erwartet wird, ist das Ergebnis. Können Sie das bitte ausarbeiten? Ich konnte keinen Unterschied im Code zwischen dieser Linie und anderen sehen. Bitte helfe dir –

+0

@TomCruise Die mittlere Zeile in deinem Code sagt 'var result = repository.setAsync (data);', d. H. Es gibt kein 'wait'. Unter der Annahme, dass 'setAsync' eine 'async' Methode ist, lautet ihre Signatur 'Task ', also 'result' ist eine Aufgabe. – dasblinkenlight

+0

So wird bei Async-Operationen mit "Warten" der Thread auf den Abschluss der Aktion warten. Also, was ist das Konzept von Callback und Feuer und hier vergessen? –

Verwandte Themen