Ultimamente ho riscontrato alcune situazioni in cui i metodi async
vengono eseguiti in modo sincrono, ma restituiscono comunque un'attività, in modo che possano essere attesi, ad es.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);
}
Sicuramente è meglio inviare l'operazione probabilmente a lungo-in esecuzione ad un filo e restituire il compito ancora attivo, per essere effettivamente atteso:
public virtual Task CreateAsync(TUser user)
{
ThrowIfDisposed();
if (user == null) throw new ArgumentNullException("user");
return Task.Run(() =>
{
Context.Save(user);
Context.Flush();
});
}
ho qualche sospetto, però, che solo la filatura dei fili TPL non è la pratica più sicura. Qualche commento su questi due diversi modelli?
Se possibile, è necessario chiamare un metodo asincrono effettivo anziché uno di questi. – SLaks
@SLaks In che modo il secondo non è asincrono (oltre a non usare una nuova parola chiave)? (proveniente da qualcuno che non usa spesso le funzioni asincrone) –
@KyleW: Spreca ancora un thread. Vedi http://blog.slaks.net/2014-12-23/parallelism-async-threading-explained/ – SLaks