当前位置: 首页 > 面试题库 >

异步命令和Task.WhenAny在StackExchange.Redis中等待后发生超时异常

郎同化
2023-03-14
问题内容

我正在经历所谓的 超时执行HGET company:product:settings,inst:1,队列:8,qu = 0,qs = 8,qc =
0,wr = 0/0,in = 79/1
超时异常。

奇怪的是,同一Redis实例和同一台机器上正在存储数据,但是它是引发此异常的特定应用程序。 更新:
实际上,同一应用程序在上面的一行中,从Redis接收数据。问题在于HGET

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

另外,我检查了IDatabase实例是否IsConnected具有true价值。

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

一些背景…

我已经成功解决了某些代码段获取 数据库 (即) 更改的问题。 __multiplexer.GetDatabase()

尽管 Multiplexer
具有AppDomainStackExchange.Redis文档中所述的实例,但是许多控制组件的反转都IDatabase在自己的代码中创建了许多实例。也就是说,IDatabase实例不共享。

实际代码执行ListRightPopLeftPush,然后实例化控制组件的反转,该反转将在组件初始化期间读取哈希键。如果在执行所谓的之前实例化整个组件ListRightPopLeftPush,那么整个组件HashGet将不会抛出超时异常。

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

无论如何,我的 修复程序无法解决 问题。我刚刚添加了更详细的信息,以让我们找到问题所在及其解决方案。

更新资料

无论如何,上述“修复”将无法修复对Redis的进一步读取访问。我在进一步的通话中遇到了相同的超时异常。现在in在异常消息中发现的参数说60/1


问题答案:

基于聊天中的长时间讨论以及大量的挖掘,在某些晦涩的情况下,TPL似乎在执行类似的操作时.TrySetResult(通常:)劫持了专用的阅读器线程。如果您进行同步调用,这将导致即时死锁,因为如果忙于等待任务完成(它只能自己完成),则它可能无法处理任何套接字数据。实际上,我们确实有
专门的[ 代码_来防止这种情况的发生_ ,但是,似乎解决方法实际上 迫使
它在某些其他情况下发生。哪个…太可怕了。我会看到我能找到的。但基本上,问题是, 目前 ,在 一些有限的情况下TaskCompletionSource.TrySetResult正在赋予TPL权力以运行同步延续。这包括Task.WhenAny



 类似资料:
  • 问题内容: 我使用Node.js和TypeScript,并且使用。这是我的测试用例: 我想为整个功能设置一个超时时间。即如果要花费2秒,花费0.5秒,花费5秒,我想在3秒钟后让我抛出错误的超时。 正常调用是一个问题,因为范围丢失了: 而且我不能用普通的方式抓住它: 有关如何解决的任何想法? 问题答案: 您可以使用超时: 您必须将其包装在诺言中才能使用。

  • 我试图在react/electron项目中使用async/await,但它不起作用。我想要的是获取docker容器状态列表。但是安慰。日志(列表)返回未定义的。 有人能帮我吗?:)

  • 在实际应用中,我对 C# 中的异步和 await 方法进行了说明。请考虑以程,这是工作代码的简单版本: 助手.cs 功能控制器.cs processing.js 现在,问题是第三方服务的所需时间更少(例如:2秒),而所需的时间更多(例如:100秒)。进行两个ajax调用并使用异步和等待是为了呈现自我。屏幕上显示数据1,不要等到自己。Data2已被检索。不幸的是,这种情况没有发生,我必须等待100秒

  • 任务或任务 我们也可以定义自己的可实现对象。对象应具有以下资格。 < li >它有一个GetAwaiter()方法(实例方法或扩展方法); < li >其GetAwaiter()方法返回一个Awaiter。在下列情况下,对象是一个标识符: < ul > < li >它实现INotifyCompletion或ICriticalNotifyCompletion接口; < li >它有一个IsCompl

  • 我一直试图理解C#中的Async/await和Task,但尽管看了youtube视频,阅读了文档,并参加了pluralsight课程,但一直失败得很厉害。 我希望有人能帮助回答这些稍微抽象的问题,帮助我的大脑摆脱困境。 1.为什么说async/await启用了一个“Asynchonrous”方法,而async关键字本身什么也不做,而await关键字添加了一个挂起点?添加挂起点不是强制方法同步操作,

  • 我想进行一个基于当前状态的API调用,但不能使setState函数作为异步函数工作。 给我错误: 类型为“”的参数(状态:只读)= 如果我在setState方法之外获取数据,它会起作用,但我害怕对过时的页码进行API调用: