Angenommen, ich habe eine Schnittstelle, die eine asynchrone Methode enthält, und ich habe zwei verschiedene Implementierungen dieser Schnittstelle. Eine der beiden Implementierungen ist natürlich asynchron und die andere nicht. Was wäre der "korrekteste" Weg zur Implementierung der Nicht-Async-Methode?To Task.Run oder nicht zu Task.Run
public interface ISomething {
Task<Foo> DoSomethingAsync();
}
// Normal async implementation
public class Implementation1 : ISomething {
async Task<Foo> ISomething.DoSomethingAsync() {
return await DoSomethingElseAsync();
}
}
// Non-async implementation
public class Implementation2 : ISomething {
// Should it be:
async Task<Foo> ISomething.DoSomethingAsync() {
return await Task.Run(() => DoSomethingElse());
}
// Or:
async Task<Foo> ISomething.DoSomethingAsync() {
return DoSomethingElse();
}
}
Ich versuche blog mit Stephen Cleary zu halten, und ich weiß, keiner von ihnen tatsächlich keine Asynchron-Vorteile bietet, und ich bin ok damit. Die zweite scheint mir korrekter zu sein, da sie nicht vorgibt, etwas zu sein, was sie nicht ist, aber sie gibt eine Compiler-Warnung, und diese summieren sich und werden ablenkend.
Das wäre alles innerhalb von ASP.NET (sowohl Web MVC und WebAPI), wenn das einen Unterschied macht.
Ihre „normale Async Implementierung“ ist nicht gültig ... Sie haben nichts zurückkehrt, noch Ihr Rückgabetyp ist 'Aufgabe'. –
@ B.K. Danke, ich habe die Rückkehr vergessen. Fest. –
Sie können 'Task.RunSynchronously' anstelle von' Task.Run' verwenden, um das 'async'-artige Ausnahmebildungsverhalten ohne redundantes' ThreadPool'-Offloading zu erhalten, wie [hier] beschrieben (http://stackoverflow.com/a/21082631/1768303). – Noseratio