Ich bin in letzter Zeit ziemlich viele Situationen gestoßen, wo async
Methoden synchron ausführen, aber eine Aufgabe trotzdem zurückgeben, so dass sie erwartet werden können, z.Task.FromResult() vs Task.Run()
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
Context.Save(user);
Context.Flush();
return Task.FromResult(0);
}
Sicherlich ist es besser, die wahrscheinlich lange laufende Betrieb zu einem Faden und gibt die noch aktive Aufgabe zu entsenden, um wirklich abgewartet werden:
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
return Task.Run(() =>
{
Context.Save(user);
Context.Flush();
});
}
ich einigen Verdacht aber, dass nur Das Abspulen von TPL-Threads ist nicht die sicherste Vorgehensweise. Irgendwelche Kommentare zu diesen zwei verschiedenen Mustern?
Wenn möglich, sollten Sie eine tatsächliche Async-Methode anstelle von beiden aufrufen. – SLaks
@SLaks Auf welche Weise ist der zweite nicht asynchron (außer dass kein neues Schlüsselwort verwendet wird)? (kommt von jemandem, der häufig keine Async-Funktionen verwendet) –
@KyleW: Es verschwendet immer noch einen Thread. Siehe http://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/ – SLaks