[英]StackExchange.Redis async call hangs
試圖弄清楚為什么這段代碼會掛起。 我可以刪除測試底部的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
的同步上下文死鎖。 這就是你永遠不會那樣做的原因 - (換成“Gilbert and Sullivan”): 好吧,幾乎沒有!
如果它有幫助,我懷疑在Wait
子樹中刪除await
將修復它 - 這應該是微不足道的,因為該樹可以用一個普通的pass-thru替換:
public Task<bool> AddAsync(IDatabase db, string key, string value) {
return db.StringSetAsync(key, value, null, When.NotExists);
}
這里重要的一點是SE.Redis在內部繞過sync-context(庫代碼正常),所以它不應該有死鎖。
但最終:混合Wait
和await
不是一個好主意。 除了死鎖之外,這是“同步異步” - 一種反模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.