Creating a task wrapper around an existing object

Star  picture Star · Jan 14, 2011 · Viewed 10.4k times · Source

I have a method which returns a Task where the implementation may or may not need to perform a slow operation in order to retrieve the result. I would like to be able to simply wrap the result value into a Task which is marked as having completed synchronously in the case where the value is already available. Today I have something like this:

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());
    }
  }
}

Is there is simpler way to do this that doesn't require me to construct the task with a delegate when I already know the result?

Answer

Matt Dillard picture Matt Dillard · Jul 8, 2014

Beginning with .NET 4.5, you can use the Task.FromResult<T>() static method for exactly this purpose:

return Task.FromResult(_Cache[key]);