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

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

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

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

或者只是没有让它排队并且有一些错误回应,这可能吗?

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

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

我在net.tcp listenBacklog设置的设置上看到了一些东西,但我们使用的是不同的绑定,我们是否需要切换?切换工作?

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

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

当队列已满时使用,等待,锁定,互斥调用并向客户端发送消息,这不是最舒适的方式,但它很有用,因为它需要您使用多线程.

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

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

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

点赞