Eri*_*ith 6 c# async-await stackexchange.redis
试图弄清楚为什么这段代码会挂起.我可以删除测试底部的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);
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*ell 11
听起来像是混合Wait和同步上下文死锁await.这就是你永远不会那样做的原因 - (换成"Gilbert and Sullivan"):好吧,几乎没有!
如果有帮助,我怀疑,移除await在Wait子树将修复它-这应该是微不足道的,因为这棵树可以替换为一个简单的直通:
public Task<bool> AddAsync(IDatabase db, string key, string value) {
return db.StringSetAsync(key, value, null, When.NotExists);
}
Run Code Online (Sandbox Code Playgroud)
这里重要的一点是SE.Redis在内部绕过sync-context(库代码正常),所以它不应该有死锁.
但最终:混合Wait和await是不是一个好主意.除了死锁之外,这是"同步异步" - 一种反模式.