Механизм блокировки безопасного чтения/записи для .Net Framework 4.7.2C#

Место общения программистов C#
Ответить
Anonymous
 Механизм блокировки безопасного чтения/записи для .Net Framework 4.7.2

Сообщение Anonymous »


В нашем веб-приложении .Net Framework 4.7.2 мы имеем ситуацию, когда нам нужно разрешить нескольким потокам читать файл одновременно, но только если он в данный момент не записывается, а когда он записывается, он это должно быть сделано только одним потоком.

Похоже, идеальный кандидат на ReaderWriterLockSlim

За исключением этой маленькой строчки в глубине статьи:

ReaderWriterLockSlim не защищен от прерывания потока. Вы не должны использовать его в среде, где потоки, обращающиеся к нему, могут быть прерваны, например .NET Framework. Если вы используете .NET Core или .NET 5+, это должно быть отлично. Прерывание не поддерживается в .NET Core и устарело в .NET 5. и более поздние версии.

Редко, но достаточно регулярно, чтобы это было проблемой, мы сталкиваемся с зависанием нашего приложения, и, проверив файл дампа, полученный во время зависания, у меня есть основания подозревать потерянный ReaderWriterLockSlim (много запросов к рассматриваемой странице) и множество потоков застряли в функции WaitOne).

Итак, мой вопрос: если ReaderWriterLockSlim не является подходящим кандидатом для этой ситуации, какова альтернатива?

В качестве дополнительного бонуса было бы здорово иметь возможность контролировать доступ и с помощью ключа — на данный момент ситуация усугубляется тем, что есть только один ReaderWriterLockSlim, контролирующий доступ ко всем файлам — это было бы лучше, если бы на каждый файл была одна блокировка, поэтому идеальным был бы какой-то механизм, в котором блокировки получаются и освобождаются с помощью ключа. Файлы очень большие, поэтому кэш в памяти не подходит. Кто-нибудь знает библиотеку, которая могла бы здесь помочь, или мне следует засучить рукава и создать собственный механизм с использованием мьютексов?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»