Как совместить асинхронность с блокировкой?C#

Место общения программистов C#
Ответить
Anonymous
 Как совместить асинхронность с блокировкой?

Сообщение Anonymous »

Как гласит знаменитая запись в блоге Стивена Клири, никогда не следует пытаться запускать асинхронный код синхронно (например, с помощью Task.RunSynchronous() или доступа к Task.Result). С другой стороны, вы не можете использовать оператор async/await внутри блокировки.
Мой вариант использования — приложение ASP.NET Core, которое использует IMemoryCache для кэшировать некоторые данные. Теперь, когда данные недоступны (например, кэш удален), мне приходится заново их заполнять, и это должно быть защищено блокировкой.

Код: Выделить всё

public TItem Get(object key, Func factory)
{
if (!_memoryCache.TryGetValue(key, out TItem value))
{
lock (_locker)
{
if (!_memoryCache.TryGetValue(key, out value))
{
value = factory();
Set(key, value);
}
}
}
return value;
}
В этом примере фабричная функция не может быть асинхронной! Что делать, если он должен быть асинхронным?

Подробнее здесь: https://stackoverflow.com/questions/442 ... th-locking
Ответить

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

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

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

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

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