ホームページ >バックエンド開発 >C++ >C# の `lock` ステートメント内で `await` を使用できないのはなぜですか?

C# の `lock` ステートメント内で `await` を使用できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-15 06:31:46807ブラウズ

Why Can't I Use `await` Inside a `lock` Statement in C#?

C# の制限について: await ステートメント内の lock

Microsoft の C# ドキュメントでは、await ステートメント内での lock キーワードの使用を明示的に禁止しています。 これはコンパイラの制限ではありません。これは、重大なプログラミング エラーであるデッドロックを防ぐための意図的な設計上の選択です。

デッドロックの危険

awaitlock の組み合わせに問題がある理由を調べてみましょう。 制限を回避する一般的な試みを考えてみましょう。

<code class="language-csharp">using (await Async.Lock(padlock))
{
    await SomethingAsync();
}</code>

このアプローチは一見無害に見えますが、重大なリスクを隠しています。 Monitor.Exit メソッド内の ExitDisposable.Dispose 呼び出しは無期限にブロックされる可能性があります。 これは、await が制御を譲った時点からメソッドが再開されるまでの間に、任意のコードが実行される可能性があるために発生します。 この介入コードは他のロックを取得し、ロックの取得順序を逆転させてデッドロックを引き起こす可能性があります。

コンパイラの保護措置

C# コンパイラーによる await ステートメント内での lock の禁止は、重要な安全策として機能します。 この組み合わせを許可すると、デバッグが難しいことで知られる問題であるデッドロックが発生する可能性が大幅に高まります。 この制限により、開発者がこの危険な同時実行性の欠陥を不用意に導入することが防止されます。 したがって、C# での堅牢で信頼性の高い非同期プログラミングには、この組み合わせを避けることが不可欠です。

以上がC# の `lock` ステートメント内で `await` を使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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