制限を理解する: 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