«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему «await» запрещен в операторе «Lock» в C#?

Почему «await» запрещен в операторе «Lock» в C#?

Опубликовано в 2025-03-04
Просматривать:540

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

понимание ограничения: wait и lock в c#

]

c#'s wait ключевое слово имеет решающее значение для асинхронного программирования, обеспечивая неблокирующие операции. Однако, используя wait внутри a оператора Lock строго запрещено. Это ограничение является ключевым выбором дизайна, чтобы предотвратить общий источник ошибок: тупики.

]

документация Microsoft объясняет, что wait выражение в 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); }
    }
}

Этот код пытается имитировать асинхронную блокировку, но, как указывает компилятор, он подвержен неопределенной блокированию внутри usitdisposable.dispose () , что потенциально приводит к тупикам. Это происходит потому, что monitor.exit может выполнить в другом потоке, чем тот, который приобрел блокировку, потенциально нарушающего заряд блокировки.

]

, по сути, запрет на wait inea lock является упреждающей мерой, чтобы избежать тупиков в многопоточных приложениях. Лучше всего избегать объединения асинхронных операций с lock и рассмотреть альтернативные методы синхронизации, такие как блокировки считывателя или примитивы синхронизации из system.threading .

]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3