c# - 为什么我的 WCF 服务一次只处理 3 个并行请求?

标签 c# multithreading wcf threadpool iis-8

我有一个 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); .因此,为了确认有足够的工作线程可用于处理请求,我决定让我的服务调用在流程开始时返回可用线程的数量。每个请求返回 1920 .

使用 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/

相关文章:

c# - 如何通过列名获取Excel中的列号

C# 进度条直到完成一半才更新

python - Python多线程编程有什么优势?

c# - 地址访问拒绝异常 : resolve it without netsh?

c# - 查找导致 CannotUnloadAppDomainException 的违规线程

c# - 在中间退出 Thread.Sleep 的最佳方法

multithreading - 为什么使用互斥体而不是 boolean 变量进行线程同步?

c++ - 忙于轮询 std::atomic - msvc 优化了循环 - 为什么以及如何防止?

.net - WCF ExceptionShielding 错误 ID 与传递给处理程序的 HandlingInstanceId 不匹配

c# - 何时使用 WCF 错误异常