2017-01-13 3 views
3

In einer asynchronen Methode, in der der Code nicht in Ordnung ist, gibt es einen Grund, warum jemand async markiert, auf die Aufgabe wartet und dann zurückkehrt?Sollte ich Async verwenden, wenn ich eine Aufgabe zurücksende und nichts erwarte

Abgesehen von der potenziellen Unnotwendigkeit, was sind die negativen Auswirkungen davon?

In diesem Beispiel wird davon ausgegangen, dass QueryAsync<int> zurückgibt.

private static async Task<int> InsertRecord_AsyncKeyword(SqlConnection openConnection) 
{ 
    int autoIncrementedReferralId = 
     await openConnection.QueryAsync<int>(@" 
      INSERT INTO... 
      SELECT CAST(SCOPE_IDENTITY() AS int)" 
    ); 

    return autoIncrementedReferralId; 
} 

private static Task<int> InsertRecord_NoAsyncKeyword(SqlConnection openConnection) 
{ 
    Task<int> task = 
     openConnection.QueryAsync<int>(@" 
      INSERT INTO... 
      SELECT CAST(SCOPE_IDENTITY() AS int)" 
    ); 

    return task; 
} 

// Top level method 
using (SqlConnection connection = await DbConnectionFactory.GetOpenConsumerAppSqlConnectionAsync()) 
{ 
    int result1 = await InsertRecord_NoAsyncKeyword(connection); 
    int result2 = await InsertRecord_AsyncKeyword(connection); 
} 
+0

Hoffnung, dass man wollte könnte [sicher ein asynchrones Verfahren ohne await nennen] (http://stackoverflow.com/questions/15522900/how- to-sicher-Aufruf-ein-Async-Methode-in-c-sharp-ohne-erwarten) –

+0

Methode, die Async verwenden und nicht beide sind die gleichen aus der Sicht des Aufrufers. Beide sind eine Methode, die "Aufgabe" zurückgibt. Das 'async' Schlüsselwort ermöglicht Ihnen nur die Verwendung von' wait' innerhalb der Methode, nicht des Aufrufers. –

+0

@NiyokoYuliawan Ich bin gespannt, ob das Warten früher als erwartet irgendwelche Auswirkungen auf die Leistung hätte. – contactmatt

Antwort

3

Nein, sollten Sie nicht nur hinzufügen, async zu Verfahren ohne await - da es auch Compiler-Warnung ist.

Sie sollten auch await innerhalb dieser Methode nicht unnötig hinzufügen, da es den Compiler dazu veranlasst, wesentlich komplizierteren Code für die Methode mit einigen damit verbundenen Auswirkungen auf die Leistung zu generieren.

Es gibt keinen beobachtbaren Unterschied zwischen zwei Mustern vom Zeitpunkt des Zeitpunkts - Aufgabe wird weiterhin asynchron ausgeführt und Sie können immer noch sofort oder zu einem späteren Zeitpunkt im Anrufer warten.

Es gibt einen Unterschied, den ich mir vorstellen kann - wenn Sie Aufgabe direkt zurückgeben, kann der Anrufer ConfigureAwait(false) verwenden und es wird auf anderen Thread enden. Wenn Sie await diese Aufgabe in Ihnen Methode diese Methode steuert, wo Code nach await ausgeführt wird.

Beachten Sie, dass Kosten für die Verfahren mit einzelnen await am Ende nicht wesentlich schlechter ist als ohne - so, wenn Sie für die Codierung Stil konsistente Verwendung von async auf alle asynchronen Methoden bevorzugen ist es wahrscheinlich in Ordnung, außer selten zeitkritische Stücke.

+0

Netter Punkt über die 'ConfigureAwait' – Rob

+1

Ein weiterer nützlicher Fall für das Hinzufügen von' async' und 'warten' ist, Ihren Code mit einem' try' Block zu umhüllen. Obwohl in beiden Fällen ein try-Block kompiliert würde, ist das Verhalten SEHR anders. – Aron

+0

@Aron macht in bestimmten Fällen Sinn und fängt Fehler auf. Für das Insert-Beispiel, das ich angegeben habe, würde ich wahrscheinlich versuchen, den Callstack höher zu fassen. – contactmatt

Verwandte Themen