Какова лучшая практика, используя метод asyn c в блокировке - PullRequest
2 голосов
/ 18 февраля 2020

In. Net Core, многие методы ввода / вывода имеют асин * c версию, и Microsoft предлагает нам использовать их для повышения производительности.

Но, как мы знаем, асин * c методы могут не работает правильно при нормальной блокировке, потому что нормальная блокировка относится к потоку.

Например, , Использование ReadWriteLocker в MemoryCache.when отсутствует MemoryCache , Мне нужно прочитать данные из базы данных. Теперь я знаю 2 способа решения этой проблемы:

  1. преобразование асинхронного c метода запроса к базе данных в syn c, такого как «Ожидание» или «.Result».
  2. используя специальную блокировку, такую ​​как блокировка redis или какой-то неофициальный AsyncReaderWriteLocker. (Я нашел такую, но я еще не читал ее код, поэтому я не знаю подробности, стоимости или новой ошибки об этом)

Итак, вернемся к заголовку, когда мне нужно использовать метод asyn c в блокировке, каков наилучший способ? Мне нужны некоторые предложения. Большое спасибо за чтение моего бедного Engli sh.

1 Ответ

1 голос
/ 18 февраля 2020

lock - это просто синтактический c сахар для семафора. Вы можете делать то, что вам нужно с SemaphoreSlim, вот так. Сначала объявите семафор в поле или свойстве, которое доступно из любого места, где вам нужна защита потока:

public readonly SemaphoreSlim _mySemaphoreSlim = new SemaphoreSlim(1, 1);

Затем используйте его следующим образом:

await _mySemaphoreSlim.WaitAsync(cancellationToken);
// Do whatever other sync or async operations you need.
_initializationSemaphoreSlim.Release();
...