Come eseguire in modo condizionale un codice utilizzando le attività in modo asincrono

Ho una class incaricata di recuperare risorse che le memorizza anche nella cache per un accesso rapido. La class espone un metodo asincrono per il recupero di una risorsa:

public Task GetResourceAsync(string resourceName) { return Task.Factory.StartNew(() => { // look in cache // if not found, get from disk // return resource }); } 

Il codice client è quindi simile a questo:

 myResourceProvider.GetResourceAsync("myResource") .ContinueWith(t => Console.WriteLine("Got resource " + t.Result.ToString())); 

In questo modo, viene sempre utilizzato un thread in background. Tuttavia, non voglio che il codice venga eseguito in modo asincrono se l’object è stato trovato nella cache. Se è stato trovato nella cache, mi piacerebbe restituire immediatamente la risorsa e non dover usare un altro thread.

Grazie.

.NET 4.5 ha Task.FromResult che consente di restituire un’attività Task , ma invece di eseguire un delegato su un thread del threadpool, imposta esplicitamente il valore di ritorno dell’attività.

Quindi nel contesto del tuo codice:

 public Task AsyncGetResource(string resourceName) { object valueFromCache; if (_myCache.TryGetValue(resourceName, out valueFromCache)) { return Task.FromResult(valueFromCache); } return Task.Factory.StartNew(() => { // get from disk // add to cache // return resource }); } 

Se si è ancora su .NET 4.0, è ansible utilizzare TaskCompletionSource per fare la stessa cosa:

 var tcs = new TaskCompletionSource(); tcs.SetResult(...item from cache...); return tcs.Task;