Tag: stackexchange.redis

访问StackExchange.Redis时发生死锁

调用StackExchange.Redis时遇到了死锁情况。 我不知道到底发生了什么,这是非常令人沮丧的,我将不胜感激任何有助于解决或解决此问题的意见。 如果你也有这个问题,不想阅读所有这些; 我build议您尝试将PreserveAsyncOrder设置为false 。 ConnectionMultiplexer connection = …; connection.PreserveAsyncOrder = false; 这样做可能会解决这个Q&A的僵局,也可能会提高性能。 我们的设置 代码作为控制台应用程序或Azure工作者angular色运行。 它使用HttpMessageHandler公开REST API,因此入口点是asynchronous的。 代码的某些部分具有线程关联(属于并且必须由单个线程运行)。 代码的某些部分是仅asynchronous的。 我们正在进行asynchronous同步和asynchronous同步反模式。 (混合await和Wait() / Result )。 访问Redis时,我们只使用asynchronous方法。 我们使用.NET 4.5的StackExchange.Redis 1.0.450。 僵局 当应用程序/服务启动后,它会正常运行一段时间,然后突然(几乎)所有传入请求停止运行,它们从不产生响应。 所有这些请求都被locking,等待Redis的调用完成。 有趣的是,一旦发生死锁,任何对Redis的调用都将挂起,但前提是这些调用是通过在线程池中运行的传入API请求进行的。 我们还从低优先级后台线程调用Redis,并且这些调用即使在发生死锁后也能继续工作。 看起来,只有在线程池线程中调用Redis时才会发生死锁。 我不再认为这是由于这些调用是在线程池线程上进行的。 相反,任何asynchronousRedis调用没有延续,或者同步安全继续,即使在死锁情况发生后,它仍然可以继续工作。 (请参阅下面的内容) 有关 StackExchange.Redis死锁 混合引起的死锁await和Task.Result (同步asynchronous,就像我们一样)。 但是我们的代码运行时没有同步上下文,所以在这里不适用,对吧? 如何安全地混合同步和asynchronous代码? 是的,我们不应该这样做。 但是我们这样做了,我们将不得不继续这样做一段时间。 很多需要迁移到asynchronous世界的代码。 同样,我们没有同步上下文,所以这不应该造成死锁,对吧? 在任何await之前设置ConfigureAwait(false)对此没有影响。 async命令和Task.WhenAny在StackExchange.Redis中等待之后的超时exception 这是线程劫持问题。 目前情况如何? 这可能是这里的问题吗? StackExchange.Redisasynchronous调用挂起 从Marc的回答: 混合等待,等待不是一个好主意。 […]