试图弄清楚为什么此代码挂起。我可以删除测试底部的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
。这就是为什么您永远不会那样做的原因-(切换为“吉尔伯特和沙利文”):好吧,几乎没有!
如果有帮助,我怀疑await
在Wait
子树中删除会解决问题-这应该是微不足道的,因为该树可以用平凡的直通代替:
public Task<bool> AddAsync(IDatabase db, string key, string value) {
return db.StringSetAsync(key, value, null, When.NotExists);
}
这里的重点是SE.Redis在内部绕过同步上下文(对于库代码而言是正常的),因此它不应具有死锁。
但最终:混合Wait
和await
是不是一个好主意。除了死锁,这是“异步同步”-一种反模式。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句