c# - MaxConcurrentCalls,如何告诉客户端其调用已排队? BasicHttp绑定(bind)

标签 c# wcf client client-server

我有一个具有长期运行方法的 WCF 服务(进行各种与生物学相关的查找和比对以及奇怪的事情)。

该代码很好地利用了 RAM 和 CPU 来进行单个方法调用,因此允许过多的并发调用只会使内存陷入困境。所以我真的不介意将 MaxConcurrentCalls 设置为 1。(我目前将它设置为 3,这没问题)。

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

或者根本不让它排队并响应一些错误,这可能吗?

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

我只是不希望客户端旋转 3 分钟(我们的超时 - 只有在排队时才会触发),然后在 3 分钟后处理超时。我宁愿它只是识别队列已满并说稍后再试,或者我们可以增加超时(但我想立即说'嘿,你排队可能需要一段时间')。我绝对不希望它超时,所以客户端等待并且什么也得不到并且它仍在后端处理。

我在 net.tcp listenBacklog 设置的设置中看到了一些内容,但我们使用的是不同的绑定(bind),我们需要切换吗?切换会起作用吗?

最佳答案

没有并发方式告诉用户队列已满,Microsoft 出于显而易见的原因限制了对代码队列的访问,Microsoft 不希望您开始摆弄队列,除非它是为了控制它编程目的,例如,将调用移到队列中或使队列中的一个调用优先于另一个调用。

如果你想在队列已满时进行检查,有两种方法可以做到这一点:

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

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

不幸的是,没有直接的方式告诉用户他正在排队,因为我自己多次遇到这个问题并且不得不采取解决方法。

就我而言,互斥锁是我的解决方法救星,现在我建议使用 await 调用而不是查询 MSMQ,它可能需要打开另一个线程,但它会为您提供所需的东西。

关于c# - MaxConcurrentCalls,如何告诉客户端其调用已排队? BasicHttp绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30406763/

相关文章:

java - 服务器 - 客户端与 Java 套接字通信

c# - 重命名现有文件名

C# 从 List<Item> 中查找所有匹配项

wcf - 在 ASMX Web 服务上使用 WCF 有什么好处?

c# - 在单向 WCF 调用后调用服务代理 block 上的 Close()

java - 使用 RestTemplate 使用 Spring Hateoas Restservice

c# - 如何以编程方式单击节点?

c# - 帮助解决ASP.NET Core 3.1 Application中的 'There is already an open DataReader associated with this Command which must be closed first'

wcf - 在 Entity Framework POCO 模板中添加 [DataMember] [DataContract] 属性

C套接字客户端重新连接到服务器时收到大量数据