Ответ 1
.NET 4.5 имеет Task.FromResult
, который позволяет вернуть Task<T>
, но вместо запуска делегата в потоке threadpool он явно устанавливает задачу возврата значение.
Итак, в контексте вашего кода:
public Task<object> AsyncGetResource(string resourceName)
{
object valueFromCache;
if (_myCache.TryGetValue(resourceName, out valueFromCache)) {
return Task.FromResult(valueFromCache);
}
return Task.Factory.StartNew<object>(() =>
{
// get from disk
// add to cache
// return resource
});
}
Если вы все еще используете .NET 4.0, вы можете использовать TaskCompletionSource<T>
, чтобы сделать то же самое:
var tcs = new TaskCompletionSource<object>();
tcs.SetResult(...item from cache...);
return tcs.Task;