2017-02-15 2 views
5

Lassen Sie uns sagen, dass ich eine Methode, die ein anderes asynchrones Verfahren unmittelbar oder ähnliche Anrufe:Benötigt eine asynchrone Passthrough-Methode wirklich das Muster "Warten/Asynchron"?

//Main method 
public async Task<int> Foo1(int x) 
{ 
    var result = await DoingSomethingAsync(x); 
    return DoSomethingElse(result); 
} 
//other method 
public async Task<int> Foo2(Double double) 
{ 
    return await Foo1(Convert.ToInt32(double)); 
} 

Gibt es einen bestimmten Grund, dass Foo2 Bedürfnisse/sollte async haben/await, wie einfach Aufruf Gegensatz:

//other method 
public Task<int> Foo3(Double double) 
{ 
    return Foo1(Convert.ToInt32(double)); 
} 

In einem Verbraucher, würde dies noch abgewartet werden, likeso, unabhängig von:

int x = await Foo1(1); 
int x = await Foo2(1D); 
int x = await Foo3(1D); 

alle, Aussagen werden kompilieren. Wird der Compiler unterschiedliche IL für die zwei verschiedenen Methoden generieren?

Antwort

6

Kommt drauf an. Insbesondere unterscheidet sich das Ausnahmeverhalten, wenn Convert.ToInt32 ausgelöst wird.

Ich habe eine ganze blog post on the subject, aber zusammenfassend würde ich async/await hier verwenden, da die Ausnahme auf die zurückgegebene Aufgabe platziert werden würde. Andernfalls würde die Ausnahme direkt ausgelöst werden.

Das direkte Auslösen von Exceptions ist nur für Vorbedingungsausnahmen zulässig (d. H., Es ist eine Verletzung der API, ein Double zu übergeben, das nicht in ein int konvertiert werden kann). Und selbst dann (für Vorbedingungsausnahmen) können Sie entweder Ausnahmen direkt auslösen oder sie in die zurückgegebene Aufgabe einfügen.

Verwandte Themen