Создание оболочки задачи вокруг существующего объекта

У меня есть метод, который возвращает Task, в котором реализации может потребоваться или не потребуется выполнять медленную операцию для получения результата. Я хотел бы иметь возможность просто обернуть значение результата в задачу, которая помечена как завершенная синхронно в случае, когда значение уже доступно. Сегодня у меня есть что-то вроде этого:

public Task<Foo> GetFooAsync(int key) {
  lock(this) {
    if(_Cache.ContainsKey(key) ) {
      Task<Foo> ret = new Task<Foo>(()=>_Cache[key]);
      ret.RunSynchronously();
      return ret;
    }
    else {
      return Task.Factory.StartNew<Foo>(SomethingSlow());
    }
  }
}

Есть ли более простой способ сделать это, не требующий от меня построения задачи с делегатом, когда я уже знаю результат?

15
задан Star 14 January 2011 в 15:56
поделиться