Although there is a AsyncCache in the parallel extensions package mentioned by @TrevorBrooks, it didn't work the way I expected. I needed to put/get/remove items from a distributed cache with a Task that could be awaited. So I ended up creating the following interface:
public interface IAsyncCache<T>
{
Task Initialize(Dictionary<string, string> parameters);
Task Put(string key, T value, TimeSpan lifeSpan);
Task<T> Get(string key);
Task Remove(string key);
}
I have since been able to implement that interface against several cache providers that offer Task/Async version for their get/put/remove methods and its working well.