で待つ場合は疑問に思う私は(コメントを参照)完璧に動作します私の基底クラスの1つに、次のコードに来た:は非同期/は、ソリューションがきれい
private static Dictionary<string, TItem> _cache;
protected Dictionary<string, TItem> Cache
{
get
{
if (_cache == null)
{
// Instead of FillCacheAsync().Wait(); I now do the following:
var reset = new AutoResetEvent(false);
Task.Run(
async() =>
{
await FillCacheAsync();
reset.Set();
});
reset.WaitOne();
}
return _cache;
}
}
private async Task FillCacheAsync()
{
_cache = new Dictionary<string, TItem>();
await InternalCacheFillAsync();
}
// This is not part of the question.
protected abstract Task InternalCacheFillAsync();
これは怠惰な問題に適したソリューションですプロパティをasync
としてマークすることはできませんか? ConfigureAwait(false)
の使用でさえ、私は大きな問題を抱えていました。
シンプル 'FillCacheAsync()を使用しないのはなぜが(待って) '?イベントでのこの余分な作業のメリットは何ですか? – Honza
@Honza:私が私の記事に書いたように、私は慎重に 'ConfigureAwait'を使い切っても重い問題につながります。 – sprinter252
'AutoResetEvent'は本当に必要ではありません。より良いブロッキング解決策は 'Task.Run(()=> FillCacheAsync())。GetAwaiter()。GetResult()'です。ただし、['AsyncLazy'](https://github.com/StephenCleary/AsyncEx.Coordination)など、ブロックするのは最善ではありません。 –