异步命令和Task.WhenAny等待StackExchange.Redis中的超时exception

我正在经历所谓的Timeout执行HGET公司:产品:设置,inst:1,队列:8,qu = 0,qs = 8,qc = 0,wr = 0/0,in = 79/1超时exception。

这很奇怪,因为相同的Redis实例和同一台机器存储数据,但它是一个抛出此exception的特定应用程序。 更新:事实上,同一个应用程序,上面一行从Redis接收数据。 问题出在HGET

此外,我将多路复用器配置的超时时间增加到6秒,没有运气。

另外,我已经检查过IDatabase实例的IsConnectedtrue值。

如何解释这些错误消息以及整个超时背后的问题是什么?

一些背景……

一些代码段获取数据库 (即multiplexer.GetDatabase()时,我已经成功修复了问题。

虽然多路复用器每个AppDomain都有一个实例,如StackExchange.Redis文档中所述,但许多控制组件的反转都在自己的代码中创建了许多IDatabase实例。 也就是说,不共享IDatabase实例。

实际代码正在执行ListRightPopLeftPush ,之后,它实例化控件组件的反转,该组件在组件实例化期间读取哈希键。 如果在执行所谓的ListRightPopLeftPush之前实例化整个组件,则整个HashGet不会抛出超时exception。

看起来即使从其他ListRightPopLeftPush实例执行ListRightPopLeftPush ,它在执行读取操作时会在下一个ListRightPopLeftPush实例中产生某种问题。

无论如何,我的修复不回答这个问题。 我刚刚添加了更详细的信息,让我们找到问题所在和自己的解决方案。

更新

无论如何,上面的“修复”不会修复对Redis的进一步读取访问。 我在进一步的调用中得到了相同的超时exception。 现在in在exception的消息中发现的参数为60/1

基于聊天中的长时间讨论以及大量的挖掘,看起来在一些晦涩的场景中,当我们处理像.TrySetResult (我们经常这样做)这样的事情时,TPL正在劫持专用的读者线程。 如果您进行同步调用,这会导致即时死锁,因为如果忙于等待任务完成(它本身只能完成),它就不可能处理任何套接字数据。 我们确实有专门的代码来防止这种情况 ,但看起来解决方法实际上迫使它在其他一些场景中发生。 哪个……太可怕了。 我会看到我能找到的东西。 但基本上,问题是目前 ,在一些有限的情况下TaskCompletionSource.TrySetResult正在为TPL提供运行同步延续的能力。 这包括Task.WhenAny