Механизм блокировки безопасного чтения/записи для .Net Framework 4.7.2 ⇐ C#
-
Anonymous
Механизм блокировки безопасного чтения/записи для .Net Framework 4.7.2
В нашем веб-приложении .Net Framework 4.7.2 мы имеем ситуацию, когда нам нужно разрешить нескольким потокам читать файл одновременно, но только если он в данный момент не записывается, а когда он записывается, он это должно быть сделано только одним потоком.
Похоже, идеальный кандидат на ReaderWriterLockSlim
За исключением этой маленькой строчки в глубине статьи:
ReaderWriterLockSlim не защищен от прерывания потока. Вы не должны использовать его в среде, где потоки, обращающиеся к нему, могут быть прерваны, например .NET Framework. Если вы используете .NET Core или .NET 5+, это должно быть отлично. Прерывание не поддерживается в .NET Core и устарело в .NET 5. и более поздние версии.
Редко, но достаточно регулярно, чтобы это было проблемой, мы сталкиваемся с зависанием нашего приложения, и, проверив файл дампа, полученный во время зависания, у меня есть основания подозревать потерянный ReaderWriterLockSlim (много запросов к рассматриваемой странице) и множество потоков застряли в функции WaitOne).
Итак, мой вопрос: если ReaderWriterLockSlim не является подходящим кандидатом для этой ситуации, какова альтернатива?
В качестве дополнительного бонуса было бы здорово иметь возможность контролировать доступ и с помощью ключа — на данный момент ситуация усугубляется тем, что есть только один ReaderWriterLockSlim, контролирующий доступ ко всем файлам — это было бы лучше, если бы на каждый файл была одна блокировка, поэтому идеальным был бы какой-то механизм, в котором блокировки получаются и освобождаются с помощью ключа. Файлы очень большие, поэтому кэш в памяти не подходит. Кто-нибудь знает библиотеку, которая могла бы здесь помочь, или мне следует засучить рукава и создать собственный механизм с использованием мьютексов?
В нашем веб-приложении .Net Framework 4.7.2 мы имеем ситуацию, когда нам нужно разрешить нескольким потокам читать файл одновременно, но только если он в данный момент не записывается, а когда он записывается, он это должно быть сделано только одним потоком.
Похоже, идеальный кандидат на ReaderWriterLockSlim
За исключением этой маленькой строчки в глубине статьи:
ReaderWriterLockSlim не защищен от прерывания потока. Вы не должны использовать его в среде, где потоки, обращающиеся к нему, могут быть прерваны, например .NET Framework. Если вы используете .NET Core или .NET 5+, это должно быть отлично. Прерывание не поддерживается в .NET Core и устарело в .NET 5. и более поздние версии.
Редко, но достаточно регулярно, чтобы это было проблемой, мы сталкиваемся с зависанием нашего приложения, и, проверив файл дампа, полученный во время зависания, у меня есть основания подозревать потерянный ReaderWriterLockSlim (много запросов к рассматриваемой странице) и множество потоков застряли в функции WaitOne).
Итак, мой вопрос: если ReaderWriterLockSlim не является подходящим кандидатом для этой ситуации, какова альтернатива?
В качестве дополнительного бонуса было бы здорово иметь возможность контролировать доступ и с помощью ключа — на данный момент ситуация усугубляется тем, что есть только один ReaderWriterLockSlim, контролирующий доступ ко всем файлам — это было бы лучше, если бы на каждый файл была одна блокировка, поэтому идеальным был бы какой-то механизм, в котором блокировки получаются и освобождаются с помощью ключа. Файлы очень большие, поэтому кэш в памяти не подходит. Кто-нибудь знает библиотеку, которая могла бы здесь помочь, или мне следует засучить рукава и создать собственный механизм с использованием мьютексов?
Мобильная версия