我有一个 WPF 应用程序在做一些非常简单的事情。我只是让它开火 4
请求基本 WCF Service
.
private async Task MultipleWcfCalls()
{
ServiceReference.Service1Client _proxy = new ServiceReference.Service1Client();
_proxy.Open();
var t1 = _proxy.GetDataAsync(0);
var t2 = _proxy.GetDataAsync(0);
var t3 = _proxy.GetDataAsync(0);
var t4 = _proxy.GetDataAsync(0);
await Task.WhenAll(t1, t2, t3, t4);
}
我的服务是做经典Task.Delay(3000)
.
public async Task<string> GetDataAsync(int value)
{
int other = 0;
int workerThreadsAvail = 0;
ThreadPool.GetMinThreads(out workerThreadsAvail, out other);
await Task.Delay(3000);
return workerThreadsAvail.ToString();
}
我希望 4
要求被解雇,和3
几秒钟后,我希望所有四个请求都返回。好吧,实际发生的是所有四个请求都通过网络发送,前三个请求将返回,然后最后一个请求将返回 3
几秒钟之后。
节流
起初我以为这是我的问题。好吧,我添加了<serviceThrottling maxConcurrentCalls="10"/>
诠释我的 web.config
它没有任何区别。所以,然后我读到它可能是我的代理达到的连接限制,所以我添加了 ServicePointManager.DefaultConnectionLimit=10;
到我的 WPF 应用程序。
线程饥饿
然后,我不断遇到线程匮乏的情况。因此,作为测试,我尝试将最小线程数设置为 20
确保我有足够的动力来处理 4
要求。我将其添加到我的 WPF 应用程序中 ThreadPool.SetMinThreads(20, 20);
.因此,为了确认有足够的工作线程可用于处理请求,我决定让我的服务调用在流程开始时返回可用线程的数量。每个请求返回 19
或 20
.
使用 Fiddler,我可以确认所有 4
请求已从 WPF(客户端)应用程序通过线路发送。现在,我的 Wcf 正在使用 basicHttpBinding
, 所以它在 Per Call
中运行实例模式所以并发模式应该无关紧要,但我已经添加了[ServiceBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)]
只是为了安全。
我已经使用 System.Diagnostics.XmlWriterTraceListener
完成了一些堆栈跟踪我可以确认我得到了 3
请求同时记录(几乎),然后第四个请求在 3 秒后记录。
Wcf 托管在 IIS
中.如果需要更多信息,请告诉我,我会尽快添加。
根据要求,这是我的 WCF 界面。
namespace SampleWCF
{
// NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IService1" in both code and config file together.
[ServiceContract]
public interface IService1
{
[OperationContract]
System.Threading.Tasks.Task<string> GetData(int value);
}
}
最佳答案
经过大量研究,this是我发现的唯一可以解释这种行为的东西。我在 Windows 10
上运行 IIS 8
。虽然我找不到我的确切版本组合的限制,但我认为这可能是问题所在。
微软似乎会对同时请求的数量进行限制。对于一些基本版本,3 将是限制。我似乎无法在任何地方更改这些设置,所以如果您知道如何更改,请为遇到此问题的其他人发布另一个答案。
关于c# - 为什么我的 WCF 服务一次只处理 3 个并行请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51796836/