Intereting Posts
Глобально изменяющийся формат отрицательных номеров валют в C # Ошибка при декодировании OAEP Ошибка привязки данных WPF в свойстве Tag Использование SWIG с методами, которые принимают std :: string в качестве параметра Самый простой способ конвертировать цвет как строку, например #XXXXXX в System.Windows.Media.Brush Unit Test C # Automapper, Mapper Не инициализирован. Инициализация вызова с правильной настройкой Как определить дублирующие узлы в XPath 1.0 с помощью XPathNavigator для оценки? Зачем использовать частные члены, затем использовать общедоступные свойства для их установки? проверьте, является ли браузер хромом или краем Должны ли все методы Entity Framework использовать async? Событие нажатия клавиш, на которое воздействуют кнопки Разрешить пользователю загружать файл с помощью Ajax Изменение размера изображения пропорционально в ASP.NET C # путем указания высоты или ширины Если reflection неэффективно, когда оно наиболее подходит?

Асинхронный вызов StackExchange.Redis

Попытка выяснить, почему этот код висит. Я могу удалить любую из трех строк в нижней части теста, и она не будет висеть, но все 3 вместе заставляют ее висеть. Любая помощь будет принята с благодарностью!

[Fact] public async Task CanAddValuesInParallel() { var muxer = ConnectionMultiplexer.Connect("localhost"); var db = muxer.GetDatabase(); await AddAsync(db, "test", "1"); await db.KeyDeleteAsync("test"); Task.Run(() => AddAsync(db, "test", "1")).Wait(); } public async Task AddAsync(IDatabase db, string key, string value) { return await db.StringSetAsync(key, value, null, When.NotExists); } 

Это звучит для меня как синдром-контекст тупика от смешивания Wait и await . Вот почему вы этого никогда не делаете (переключаясь на «Гилберт и Салливан»): хорошо, почти никогда!

Если это помогает, я подозреваю, что удаление await в подэлементе Wait исправит его – это должно быть тривиально, поскольку это дерево можно заменить тривиальным pass-thru:

 public Task AddAsync(IDatabase db, string key, string value) { return db.StringSetAsync(key, value, null, When.NotExists); } 

Важным моментом здесь является то, что SE.Redis обходит синхронный контекст внутри (нормальный для кода библиотеки), поэтому он не должен иметь тупик.

Но в конечном счете: смешение Wait и await – не очень хорошая идея. В дополнение к взаимоблокировкам это «синхронизация через async» – анти-шаблон.