加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 使用Rx排队操作我不希望在特定时间之前执行?

发布时间:2020-12-16 01:46:51 所属栏目:百科 来源:网络整理
导读:简介:我有一个Web应用程序,可以在业务对象上执行工作流,有时需要在步骤之间有意等待几秒或几分钟.我期待(可能通过Rx.NET),改进这些工作流程的执行,这样我就不会耗尽ThreadPool,并在系统负载很重时使网站无响应. 工作流程的一个非常简化的版本是: 创建一个
简介:我有一个Web应用程序,可以在业务对象上执行工作流,有时需要在步骤之间有意等待几秒或几分钟.我期待(可能通过Rx.NET),改进这些工作流程的执行,这样我就不会耗尽ThreadPool,并在系统负载很重时使网站无响应.

工作流程的一个非常简化的版本是:

>创建一个对象
>从系统A将数据加载到其中
>将此数据发布到系统B.

如果系统A关闭,我的应用程序将等待并稍后重试.等待时间是在GMail不断升级的重试延迟之后建模的:等待1秒,每次后续重试加倍(最多1小时).该应用程序痴迷地将状态保存到数据库,因此如果整个应用程序爆炸,当它重新启动时,它将恢复它停止的所有工作流程.

目前(请温和)工作流程中的每个步骤都是通过调用ThreadPool.QueueUserWorkItem来排队调用Thread.Sleep的方法来执行,如果需要进行上述重试延迟,则实际执行该步骤.

如果系统运行良好(没有错误),它可以轻松处理我们抛出的所有流量,并且ThreadPool可以很好地管理所有这些工作流实例的并行执行.但是如果系统B停机一段时间,重试计数就会延迟增长,很快ThreadPool就会充满所有睡眠线程,导致网站对新请求没有响应.

基本上我想将所有这些待处理的工作流抛出到一个排队的队列中(最后执行时间所需的重试延迟).尽管阅读了很多关于Rx并且很兴奋的事情,但我从来没有机会使用它,但似乎它可能是一种有用的方法来处理这个问题.如果Rx能够在他们准备开火的时候神奇地管理吐出这些物体,那么它似乎就是这样

>大大简化和澄清这种逻辑,并且
>防止浪费使用大量刚刚在99%的时间内睡觉的线程

对Rx新手的任何指导都会非常感激,即使它只是为了解释为什么这实际上不是Rx的一个好用例.

解决方法

在Rx论坛上查看这篇文章.对于您想要解决的问题,非常方便的运算符: http://social.msdn.microsoft.com/Forums/en-US/rx/thread/af43b14e-fb00-42d4-8fb1-5c45862f7796/

Rx是处理这类(特别是)问题的好方法,因为你可以拥有异步函数/ observables并将通用运算符应用于所描述的Retry运算符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读