2012-10-26 21 views
20

ich ein Asynchron-Methode haben:.NET 4.5 Asynchron warten und überladene Methoden

public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, string language, bool throwEx = true) 
{ 
    UserLoginExResult result = await UserService.LoginExAsync(UserGroup, language, TimezoneOffset, GetDeviceInfo(), GetLoginProperties(), exRequest); 

    ProcessLoginResult(result, false, throwEx); 

    return result; 
} 

Und eine Überlastung:

public Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true) 
{ 
    return LoginExAsync(exRequest, Language.ID, throwEx); 
} 

Ich bin nicht sicher, ob ich das überladene ein (die man markieren sollte mit weniger Parametern) als async und await verwenden? Ich denke, ich sollte nicht, aber kannst du mir sagen, was passieren würde, wenn ich das tun würde? Ich bin ziemlich verloren hier und nicht wirklich sicher, was Task es warten würde? Würde es ein extra erstellen Task oder await erstellt keine neue Task?

Antwort

20

Nein, es gibt wenig Vorteile bei der Verwendung einer asynchronen Methode, wenn es nur geht, um ein vorhandenes zu wickeln und auszupacken. Es ist in Ordnung, hier nur eine "normale" Methode zu verwenden, die an die "echte" Async-Methode delegiert wird.

(Sie sind nicht ganz das gleiche - zum Beispiel, wenn die UserService.LoginExAsync Verfahren eher eine Ausnahme auslöst als eine fehlgeschlagene Aufgabe zurückkehren, die Asynchron/await-Version wird nur ein ausgefallenes Aufgabe zurückkehren, während die andere Version wird auch werfen sofort.)

+0

Aber ist es schaden, es hinzuzufügen? Was kostet der Overhead? Oder optimiert der Compiler es? –

+0

@Matt: Die Kosten sind im Grunde genommen die Einrichtung einer trivialen Zustandsmaschine. Es wird auch ändern, wie alle Ausnahmen, die beim Erstellen der Aufgabe ausgelöst werden, weitergegeben werden, also sind sie nicht 100% äquivalent. Aber der Compiler optimiert auf keinen Fall den anderen. –

+0

Danke. Du hast mir geholfen, einen Streit zu lösen, bevor ich ihn überhaupt haben musste. :) –

1

Die Überlastung muss nicht als async markiert werden, da es intern nichts erwartet, also gibt es nichts für den Compiler neu zu schreiben.

3

Es wäre wirklich nur sinnvoll, wenn Sie zusätzliche Arbeit in Ihrer Überlastung, z.

public async Task<UserLoginExResult> LoginExAsync(CustomTable exRequest, bool throwEx = true) 
{ 
    Task<UserLoginExResult> result = await LoginExAsync(exRequest, Language.ID, throwEx); 

    //Do some work here that depends on the result from the task completeion 

    return result; 
} 

Aber wie Sie nicht sind, ist es nicht!

7

Das Schlüsselwort async aktiviert nur das Schlüsselwort await. In Ihrem Fall können Sie die Task direkt zurückgeben, so dass das Schlüsselwort async nicht benötigt wird. async würde nur Overhead hinzufügen, ohne einen Wert hinzuzufügen.

Weitere Informationen finden Sie unter Stephen Toub's Zen of Async talk. Er spricht diese Situation direkt an.

Verwandte Themen