Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MaxConcurrentCalls,如何告诉客户端其调用已排队?碱基结合_C#_Wcf_Client_Client Server - Fatal编程技术网

C# MaxConcurrentCalls,如何告诉客户端其调用已排队?碱基结合

C# MaxConcurrentCalls,如何告诉客户端其调用已排队?碱基结合,c#,wcf,client,client-server,C#,Wcf,Client,Client Server,我有一个WCF服务,它有一个长时间运行的方法(做各种与生物学相关的查找、对齐和奇怪的事情) 该代码将RAM和CPU很好地用于单个方法调用,因此允许过多的并发调用只会使其在内存上陷入困境。所以我真的不介意将MaxConcurrentCalls设置为1。(我现在3点就可以了) 我关心的是,当方法被调用并排队时,我希望我的客户机立即知道它已排队。可能吗 或者根本不让它排队,然后用一些错误来响应,这是可能的吗 至少我希望如果客户端断开连接或超时,我希望它不要处理,这是可能的吗? (我认为如果超时,它实际

我有一个WCF服务,它有一个长时间运行的方法(做各种与生物学相关的查找、对齐和奇怪的事情)

该代码将RAM和CPU很好地用于单个方法调用,因此允许过多的并发调用只会使其在内存上陷入困境。所以我真的不介意将MaxConcurrentCalls设置为1。(我现在3点就可以了)

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

或者根本不让它排队,然后用一些错误来响应,这是可能的吗

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

我只是不希望客户端旋转3分钟(我们的超时-只有在事情排队时才会出现),然后在3分钟后处理超时。我宁愿它只是识别出队列已满,然后说稍后立即重试,或者我们可以增加超时时间(但是我想马上说‘嘿,你排队了,可能有一段时间了’)。我绝对不希望它超时,所以客户端等待,什么也得不到,它仍然在后端处理


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

无法同时告诉用户队列已满,Microsoft出于明显的原因限制从代码中访问队列,Microsoft不希望您开始摆弄队列,除非出于编程目的对其进行控制,例如,将呼叫移动到队列中,或将一个呼叫的重要性置于另一个呼叫之上

如果要在队列已满时进行检查,有两种方法:

当队列已满时,使用、
wait、lock、mutex
调用并向客户端提示消息,这不是最合适的方法,但很有用,因为它需要使用多线程

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

不幸的是,没有直接的方法告诉用户他排队了,因为我自己也多次遇到这个问题,不得不采取变通办法

在我的例子中,互斥是我的解决方案救世主,现在我建议使用等待调用而不是查询MSMQ,它可能需要打开另一个线程,但它将为您提供所需的内容。

接受更多调用(maxconcurrentcalls=10)。在您的方法中,如果InterlockedIncrement返回的值大于3(并行处理的最大计数),请对当前并行调用进行计数(InterlockedIncrement在开始时,InterlockedIncrement在最终块中),以终止当前处理(抛出异常)


总而言之:接受许多调用,提前终止那些服务器无法处理的调用。

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

在客户端,我首先调用这个方法,并执行一个短暂的超时行为。当这个ping没有异常时,我调用Worker方法

我认为,在我的场景中,当通过用户交互生成客户机实例时,在一台机器上使用命名管道就足够了


但是想一想,我更喜欢@Mikl X Answer。

为什么不让服务方法检查“队列”是否已满,并返回一个SOAP错误以达到这种效果呢?我很想知道这一点,但我不知道如何/是否可以检查队列。WCF处理队列当您设置MaxConcurrentCalls时,它会开始将超过max的呼叫路由到队列中。但我似乎无法控制。在电话处理之前,你不能发送任何信息。您需要实现自己的方法,比如id enqueue()getstatus(id),而不是立即调用longmethod()。