Так как класс ReaderWriterLockSlim
использует идентификатор потока, чтобы узнать, кому принадлежит блокировка, безопасно использовать его с помощью методов async, где нет никакой гарантии, что весь метод будет выполняться в том же потоке ,Можно ли использовать ReaderWriterLockSlim в асинхронном методе
Например.
System.Threading.ReaderWriterLockSlim readerwriterlock = new System.Threading.ReaderWriterLockSlim();
private async Task Test()
{
readerwriterlock.EnterWriteLock();
await Task.Yield(); //do work that could yield the task
readerwriterlock.ExitWriteLock(); //potentailly exit the lock on a different thread
}
Я читаю этот вопрос, и два ответа: ваш и Стивен Клири противоречат друг другу. Я смущен. Я понимаю, почему в WPF, например, блокировка не проблема, потому что это тот же поток, который получил блокировку в первую очередь, но Стивен говорит, несмотря на то, что тот же поток, ReaderWriterLockSlim всегда является проблемой с async, независимо от среды –
@ DonBox Ну, это не «всегда» проблема - она может работать, но это опасно. Я также предлагаю это.Как уже упоминалось, с тем же контекстом вы все равно можете получить проблемы с реентерацией, которые вызовут тупик - если вы знаете, что ваша рутина никогда не будет вызвана> 1 раз повторно, она должна работать, но это большой «если» –