ホームページ >バックエンド開発 >C++ >C# で非同期初期化メソッドを確実に 1 回実行するにはどうすればよいですか?

C# で非同期初期化メソッドを確実に 1 回実行するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-13 21:48:42605ブラウズ

How Can I Ensure Single Execution of Asynchronous Initialization Methods in C#?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。