c# - StackExchange.Redis 异步调用挂起

标签 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);
}

最佳答案

在我看来,这像是混合 Waitawait 造成的同步上下文死锁。这就是为什么你从不那样做 -(切换到“吉尔伯特和沙利文”): 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 在内部绕过同步上下文(对于库代码来说是正常的),所以它不应该有死锁。

但最终:混合使用 Waitawait 并不是一个好主意。除了死锁之外,这是“同步优于异步”——一种反模式。

关于c# - StackExchange.Redis 异步调用挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27258984/

相关文章:

redis - StackExchange.Redis API : ListLeftPopAsync is taking infinite time or timing out

c# - 直接对redis对象应用分页和排序

c# - Unity-OnTriggerEnter 未注册碰撞

c# - 在 .NET 中使用 ConfigureAwait

async-await - 在特定线程中运行异步函数

Swift CLI 应用程序 'main' 属性不能在包含顶级代码的模块中使用

redis - 如何使用 StackExchange.Redis 写入从服务器?

c# - 让wcf客户端等待回调

C# Blazor - 如何限制文本框的 onChange 事件

c# - Crystal Reports,为什么在我提供了详细信息后仍要求数据库登录?