c# – 使用Rx排队操作我不希望在特定时间之前执行?
简介:我有一个Web应用程序,可以在业务对象上执行工作流,有时需要在步骤之间有意等待几秒或几分钟.我期待(可能通过Rx.NET),改进这些工作流程的执行,这样我就不会耗尽ThreadPool,并在系统负载很重时使网站无响应.
工作流程的一个非常简化的版本是: >创建一个对象 如果系统A关闭,我的应用程序将等待并稍后重试.等待时间是在GMail不断升级的重试延迟之后建模的:等待1秒,每次后续重试加倍(最多1小时).该应用程序痴迷地将状态保存到数据库,因此如果整个应用程序爆炸,当它重新启动时,它将恢复它停止的所有工作流程. 目前(请温和)工作流程中的每个步骤都是通过调用ThreadPool.QueueUserWorkItem来排队调用Thread.Sleep的方法来执行,如果需要进行上述重试延迟,则实际执行该步骤. 如果系统运行良好(没有错误),它可以轻松处理我们抛出的所有流量,并且ThreadPool可以很好地管理所有这些工作流实例的并行执行.但是如果系统B停机一段时间,重试计数就会延迟增长,很快ThreadPool就会充满所有睡眠线程,导致网站对新请求没有响应. 基本上我想将所有这些待处理的工作流抛出到一个排队的队列中(最后执行时间所需的重试延迟).尽管阅读了很多关于Rx并且很兴奋的事情,但我从来没有机会使用它,但似乎它可能是一种有用的方法来处理这个问题.如果Rx能够在他们准备开火的时候神奇地管理吐出这些物体,那么它似乎就是这样 >大大简化和澄清这种逻辑,并且 对Rx新手的任何指导都会非常感激,即使它只是为了解释为什么这实际上不是Rx的一个好用例. 解决方法
在Rx论坛上查看这篇文章.对于您想要解决的问题,非常方便的运算符:
http://social.msdn.microsoft.com/Forums/en-US/rx/thread/af43b14e-fb00-42d4-8fb1-5c45862f7796/
Rx是处理这类(特别是)问题的好方法,因为你可以拥有异步函数/ observables并将通用运算符应用于所描述的Retry运算符. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |