簡體   English   中英

StackExchange.Redis異步調用掛起

[英]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);
}

聽起來像是混合Waitawait的同步上下文死鎖。 這就是你永遠不會那樣做的原因 - (換成“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(庫代碼正常),所以它不應該有死鎖。

但最終:混合Waitawait不是一個好主意。 除了死鎖之外,這是“同步異步” - 一種反模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM