「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > C#の「ロック」ステートメント内で「待ち望まれている」が禁止されているのはなぜですか?

C#の「ロック」ステートメント内で「待ち望まれている」が禁止されているのはなぜですか?

2025-03-04に投稿されました
ブラウズ:929

Why is `await` Prohibited Inside a `lock` Statement in C#?

制限を理解する: wait and lock in c#

c# 's await キーワードは非同期プログラミングにとって重要であり、非ブロッキング操作を可能にします。 ただし、を使用すると、 lock ステートメント内のを使用することは厳密に禁止されています。この制限は、共通のエラーソースを防ぐための重要な設計選択です:Deadlocks。

Microsoftのドキュメントは、 lock 内の式を待つ lockがリスクを生み出すことを説明しています。 コードの実行は、

がコントロールを生成するのを待った後、一時停止する可能性があり、潜在的に異なるスレッドで後で再開します。このタイミングのギャップは、他のスレッドがロックを取得し、ロック順序を逆にしてデッドロックになる状況につながる可能性があります。

仮説的な例を調べてみましょう:
class Async
{
    public static async Task Lock(object obj)
    {
        while (!Monitor.TryEnter(obj))
            await Task.Yield();

        return new ExitDisposable(obj);
    }

    private class ExitDisposable : IDisposable
    {
        private readonly object obj;
        public ExitDisposable(object obj) { this.obj = obj; }
        public void Dispose() { Monitor.Exit(this.obj); }
    }
}

このコードは非同期ロックを模倣しようとしますが、コンパイラが示すように、 exitdisposable.dispose()内で無期限のブロッキングを受ける傾向があります。 これは、 Monitor.exit

がロックを取得したスレッドとは異なるスレッドで実行され、ロックオーダーに違反する可能性があるために発生します。

本質的に、の禁止は内でロックを待ち望んでいます。 非同期操作とロック[ステートメントを組み合わせることを避け、 system.threading

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3