UPDATE: Heavily revised after @usr pointed out I\'d incorrectly assumed Lazy\'s default thread safety mode was LazyThreadSafetyMode.PublicationOn
For now, I am using this:
public class CachedAsync
{
readonly Func> _taskFactory;
T _value;
public CachedAsync(Func> taskFactory)
{
_taskFactory = taskFactory;
}
public TaskAwaiter GetAwaiter() { return Fetch().GetAwaiter(); }
async Task Fetch()
{
if (_value == null)
_value = await _taskFactory();
return _value;
}
}
While it works in my scenario (I don't have multiple triggering threads etc.), it's hardly elegant and doesn't provide thread-safe coordination of either
LazyThreadSafetyMode.ExecutionAndPublication
ORLazyThreadSafetyMode.PublicationOnly