サーバーからデータを取得するメソッドがあるとしましょう
Task<Result> GetDataFromServerAsync(...)
進行中の呼び出しがある場合、サーバーへの新しい要求を開始したくありませんが、元の要求が終了するのを待ちます。
私が持っているとしましょう
var result = await objet.GetDataFromServerAsync(...);
ほぼ同時に呼び出された別の場所で、2回目の呼び出しがあります
var result2 = await objet.GetDataFromServerAsync(...);
最初のリクエストが終了しなかった場合、2番目のリクエストでサーバーへの新しいリクエストを開始したくありません。最初の通話が終了するとすぐに、両方の通話で同じ結果が得られるようにしたいと思います。これは概念実証です。オプションはありますが、これを行うのがいかに簡単かを知りたかったのです。
以下を使用した簡単な例を次に示しLazy<Task<T>>
ます。
var lazyGetDataFromServer = new Lazy<Task<Result>>
(() => objet.GetDataFromServerAsync(...));
var result = await lazyGetDataFromServer.Value;
var result2 = await lazyGetDataFromServer.Value;
これらの2つがスレッドセーフのようにawait
別々のスレッドから実行されるかどうかは問題ではないLazy<T>
ためresult2
、2番目に実行された場合でも待機し、からの同じ出力を使用しresult
ます。
ここからのコードを使用して、これをと呼ばれるクラスにまとめAsyncLazy<T>
、カスタムを追加して、実行する必要なしにGetAwaiter
それを実行できるようにすることができawait
ます.Value
。非常に整頓されています=)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加