понимание ограничения: 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