C# の制限について: await
ステートメント内の lock
Microsoft の C# ドキュメントでは、await
ステートメント内での lock
キーワードの使用を明示的に禁止しています。 これはコンパイラの制限ではありません。これは、重大なプログラミング エラーであるデッドロックを防ぐための意図的な設計上の選択です。
デッドロックの危険
await
と lock
の組み合わせに問題がある理由を調べてみましょう。 制限を回避する一般的な試みを考えてみましょう。
<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 サイトの他の関連記事を参照してください。