"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Por que 'aguarda' é proibido dentro de uma instrução 'Lock' em C#?

Por que 'aguarda' é proibido dentro de uma instrução 'Lock' em C#?

Postado em 2025-03-04
Navegar:642

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

Entendendo a restrição: aguarda e LOCK em C#

c#'s espera palavra-chave é crucial para programação assíncrona, permitindo operações não bloqueadoras. No entanto, usando aguarda dentro de um Lock A instrução é estritamente proibida. Essa restrição é uma opção de design -chave para evitar uma fonte comum de erros: Deadlocks.

A documentação da Microsoft explica que uma expressão de aguarda dentro de um Lock cria um risco. A execução do código pode pausar após o aguarda produz controle, retomando posteriormente em um encadeamento potencialmente diferente. Essa lacuna de tempo pode levar a situações em que outros threads obtêm bloqueios, revertendo a ordem de bloqueio e resultando em um impasse.

Vamos examinar um exemplo hipotético:

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); }
    }
}

Este código tenta imitar o bloqueio assíncrono, mas, como o compilador indica, é propenso a bloqueio indefinido em exitdisposable.dispose () , levando potencialmente a deadlocks. Isso acontece porque monitor.exit pode ser executado em um thread diferente daquele que adquiriu o bloqueio, potencialmente violando a ordem de bloqueio.

em essência, a proibição de aguarda dentro de Lock é uma medida proativa para evitar impasses em aplicativos multithread. É melhor evitar combinar operações assíncronas com Lock e considerar métodos alternativos de sincronização, como bloqueios de leitor-writer ou primitivos de sincronização de System.Threading .

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3