C# での非同期初期化メソッドの単一実行
C# 開発では、非同期初期化メソッドが 1 回だけ実行されるようにすることが重要です。これにより、複数のスレッドが同時に同じ初期化を試み、潜在的なエラーにつながる競合状態が防止されます。 SemaphoreSlim
はソリューションを提供しますが、AsyncLazy<T>
パッケージの Microsoft.Extensions.Primitives
はよりエレガントで効率的なアプローチを提供します。
AsyncLazy の活用
AsyncLazy<T>
は、非同期操作の遅延初期化を提供します。 非同期タスクをカプセル化し、GetAwaiter()
を使用してタスクの完了を待つことができます。 わずかに変更された AsyncLazy<T>
クラスを以下に示します。
<code class="language-csharp">public class AsyncLazy<T> : Lazy<Task<T>> { public AsyncLazy(Func<T> valueFactory) : base(() => Task.Run(valueFactory)) { } public AsyncLazy(Func<Task<T>> taskFactory) : base(() => Task.Run(() => taskFactory())) { } public TaskAwaiter<T> GetAwaiter() { return Value.GetAwaiter(); } }</code>
実際の応用
AsyncLazy<T>
の使用は簡単です。 初期化ロジックをラムダ式としてインスタンス化します:
<code class="language-csharp">private AsyncLazy<bool> asyncLazy = new AsyncLazy<bool>(async () => { await DoStuffOnlyOnceAsync(); return true; });</code>
初期化を実行するには、asyncLazy
オブジェクトを待つだけです:
<code class="language-csharp">await asyncLazy;</code>
概要
AsyncLazy<T>
は、非同期初期化メソッドを確実に 1 回実行するためのクリーンで効率的なメカニズムを提供します。 手動ロックやセマフォ管理の複雑さを排除することで開発を簡素化し、コードがより読みやすく保守しやすくなります。
以上がC# で非同期初期化メソッドを確実に 1 回実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。