试图找出此代码挂起的原因。我可以删除测试底部的 3 行中的任何一行,它不会挂起,但所有 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<bool> AddAsync(IDatabase db, string key, string value) {
return await db.StringSetAsync(key, value, null, When.NotExists);
}
最佳答案
在我看来,这像是混合 Wait
和 await
造成的同步上下文死锁。这就是为什么你从不那样做 -(切换到“吉尔伯特和沙利文”): well, hardly ever!
如果有帮助,我怀疑删除 Wait
子树中的 await
将修复它 - 这应该是微不足道的,因为该树可以被一个简单的直通代替:
public Task<bool> AddAsync(IDatabase db, string key, string value) {
return db.StringSetAsync(key, value, null, When.NotExists);
}
这里的重点是 SE.Redis 在内部绕过同步上下文(对于库代码来说是正常的),所以它不应该有死锁。
但最终:混合使用 Wait
和 await
并不是一个好主意。除了死锁之外,这是“同步优于异步”——一种反模式。
关于c# - StackExchange.Redis 异步调用挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27258984/