MaxConcurrentCalls,我如何告诉客户端它的调用已经排队?BasicHttpBinding
本文关键字:调用 排队 BasicHttpBinding 何告诉 客户端 MaxConcurrentCalls | 更新日期: 2023-09-27 17:50:36
我有一个长期运行方法的WCF服务(做各种生物相关的查找和对齐和奇怪的东西)。
代码很好地利用了单个方法调用的RAM和cpu,因此允许太多的并发调用只会使内存陷入困境。我不介意将MaxConcurrentCalls设为1。(我现在把它设置为3,这是OK的)。
我关心的是,当方法被调用并排队时,我希望我的客户端立即知道它已排队。这可能吗?
或者根本不让它排队并响应一些错误,这可能吗?
至少我想如果客户端断开连接或超时,我希望它不处理,这是可能的吗?(我认为如果它超时,它可能实际上不处理,但如果我同时给它像6个请求,然后关闭所有的客户端,它似乎运行-最终-所有6个请求。我缩短了超时时间,我认为它可能没有运行所有6个,我必须调查更多)
我只是不希望客户端旋转3分钟(我们的超时-只有在事情排队时才会达到),然后在3分钟后处理超时。我宁愿它只是识别队列已满并说稍后再试,或者我们可以增加超时时间(但我想立即说'嘿,你正在排队,可能需要一段时间')。我绝对不希望它超时,所以客户端等待并没有得到任何东西,它仍然在后端处理。
我在网络设置上看到一些东西。tcp listenBacklog设置,但我们使用不同的绑定,我们需要切换吗?换工作管用吗?
没有并发的方式来告诉用户队列已满,Microsoft出于明显的原因限制了代码对队列的访问,Microsoft不希望您开始乱弄队列,除非是为了控制它以实现编程目的,例如,将调用移动到队列中或使队列中的一个调用比另一个调用更重要。
如果您希望在队列已满时进行检查,有两种方法:
使用,await, lock, mutex
调用时,队列已满,并提示一个消息给客户端,这不是最舒适的方式,但它是有用的,因为它需要你使用多线程。
将WCF连接到Microsoft的MSMQ服务并查询消息传递队列本身。它非常有用,但也是一个负担,因为需要为每个用户发出对MSMQ的许多调用。
没有直接的方式告诉用户他不幸排队了,因为我自己遇到过很多次这个问题,不得不做一些变通。
在我的例子中,互斥锁是我的救星,现在我建议使用await调用而不是查询MSMQ,它可能需要打开另一个线程,但它将为您提供所需的
接受更多的调用(maxconcurrentcalls = 10)。在你的方法做计数当前并行调用(InterlockedIncrement在开始,interlockeddec递减在最后块),如果InterlockedIncrement返回大于3(你的并行处理的最大计数)终止当前处理(抛出异常)。
我的解决方案是实现一个服务。IsServiceAvailable方法,它返回true。
从客户端我首先调用这个方法与一个短的超时行为。当这个ping没有得到异常时,我调用Worker-Method。
我认为,当客户端实例通过用户交互生成时,这在一台机器上使用命名管道的场景中工作得足够好。
但是考虑一下,我更喜欢@Mikl X答案