MaxConcurrentCalls,如何告诉客户端其呼叫已排队? basicHttpBinding的

时间:2015-05-22 22:29:28

标签: c# wcf client client-server

我有一个WCF服务,有一个长期运行的方法(做各种与生物学相关的查找和对齐以及奇怪的东西)。

代码利用RAM和cpus很好地进行单个方法调用,因此允许过多的并发调用会使内存陷入困境。所以我真的不介意将MaxConcurrentCalls设置为1.(我现在将它设置为3即可)。

我担心的是,当调用方法并排队时,我希望我的客户端立即知道它已经排队了。这可能吗?

或者根本就没有它排队并且有一些错误回应,这可能吗?

至少我希望如果客户断开连接或超时,我希望它不能处理,这可能吗?  (我认为如果它超时它实际上可能不会处理,但如果我同时给它6个请求,那么关闭所有客户端它似乎运行 - 最后 - 所有6个请求。我缩短了超时时间我认为它可能没有全部运行6,我将不得不调查更多)

我只是不希望客户端旋转3分钟(我们的超时 - 只有在事情排队时才会被击中),然后在处理超时的3分钟之后。我宁愿它只是认识到队列已经满了并且说稍后再试,或者我们可能会增加我们的超时(但是我想立刻说'嘿,你排队等待它可能需要一段时间&# 39)。我绝对不希望它超时,所以客户端等待并得不到任何东西,它仍在后端进行处理。

我在net.tcp listenBacklog设置的设置中看到了一些内容,但是我们使用了不同的绑定,我们是否需要切换?转换会有效吗?

3 个答案:

答案 0 :(得分:1)

没有并发方式告诉用户队列已满,Microsoft出于显而易见的原因限制了从代码访问排队,微软不希望你开始搞乱队列,除非它是用于控制它以用于编程目的,例如,将调用向上移动队列或重视对队列的一次调用而不是另一次调用。

如果您想在队列已满时进行检查,有几种方法可以执行此操作:

当队列已满时使用await, lock, mutex来电并向客户端发送消息,这不是最舒服的方式,但它很有用,因为它需要您使用多线程。

将您的WCF连接到Microsoft的MSMQ服务并查询消息传递队列本身。它非常有用,但却是一种负担,因为需要为每个用户发出许多对MSMQ的调用。

不幸的是,没有直接的方式告诉用户他排队了,因为我自己多次遇到这个问题并且不得不做一些变通办法。

在我的情况下,mutex是我的解决方案救星,现在我建议使用await调用而不是查询MSMQ,它可能需要打开另一个线程,但它会为你提供你需要的东西。

答案 1 :(得分:1)

接受更多通话(maxconcurrentcalls = 10)。在你的方法中,如果InterlockedIncrement返回大于3(并行处理的最大计数)终止当前处理(抛出异常),则执行当前并行调用的计数(开头的InterlockedIncrement,finally块中的InterlockedDecrement)。

总结一下:接受许多调用,先关闭那些对服务器来说太多的调用。

答案 2 :(得分:0)

我的解决方案是,实现Service.IsServiceAvailable方法,返回true。

从客户端我首先使用短暂的超时行为调用此方法。当我没有得到这个ping的异常时,我调用了Worker-Method。

我认为,当我通过用户交互生成客户端实例时,在一台计算机上使用命名管道的情况下,这种方法就足够了。

但考虑到这一点,我更喜欢@Mikl X答案。