C# WCF因多个请求而变慢

C# WCF因多个请求而变慢,c#,multithreading,wcf,C#,Multithreading,Wcf,我有一个使用basicHttpBinding的WCF服务,安全模式为TransportWithMessageCredential。我正在调查我们的一些客户正在面临的超时问题。我已经编写了一个小测试应用程序,它在客户端上创建多个线程,并对服务器进行“简单”调用,在一段时间内除了Thread.Sleep之外什么都不做 当我运行这个测试应用程序时,它会创建10个线程,用远程方法实例化对象,然后调用它(告诉它睡眠5秒(5000ms)) 我还尝试了服务器上线程数和“睡眠”时间的多种变化,我发现前3个或4个

我有一个使用
basicHttpBinding
的WCF服务,安全模式为
TransportWithMessageCredential
。我正在调查我们的一些客户正在面临的超时问题。我已经编写了一个小测试应用程序,它在客户端上创建多个线程,并对服务器进行“简单”调用,在一段时间内除了
Thread.Sleep
之外什么都不做

当我运行这个测试应用程序时,它会创建10个线程,用远程方法实例化对象,然后调用它(告诉它睡眠5秒(5000ms))

我还尝试了服务器上线程数和“睡眠”时间的多种变化,我发现前3个或4个线程在正确的时间内返回,但后续的线程都需要更长的时间

1:12:13.197启动测试-多功能1
1:12:13.199起动试验-多功能2
1:12:13.203起动试验-多重3
1:12:13.228起动试验-多重4
1:12:13.367已获取连接对象-Multi3
1:12:13.368起动试验-多重5
1:12:13.368已获取连接对象-Multi1
1:12:13.369已获取连接对象-Multi4
1:12:13.369已获取连接对象-Multi2
1:12:13.391起动试验-多功能6
1:12:13.394起动试验-多功能7
1:12:13.398起动试验-Multi8
1:12:13.531已获取连接对象-Multi5
1:12:13.532起动试验-多功能9
1:12:13.533已获取连接对象-Multi7
1:12:13.535已获取连接对象-Multi6
1:12:13.539起动试验-多重10
1:12:13.565已获取连接对象-Multi8
1:12:13.687已获取连接对象-Multi9
1:12:13.691已获取连接对象-Multi10
1:12:18.396结束测试-多重3
1:12:18.396结束测试-多重4
1:12:18.844结束测试-多重2
1:12:19.345结束测试-多重1
1:12:19.844结束测试-多重5
1:12:20.344结束测试-多重7
1:12:20.844结束测试-多重6
1:12:21.349结束测试-多点8
1:12:21.844结束测试-多重9
1:12:22.344结束测试-多重10

因此,根据上述结果,您可以看到所有线程都已创建,并且获得了“连接对象”。这大约需要500毫秒,考虑到它在做什么,这也不算太糟糕

然后测试
Multi3
Multi4
在大约5000毫秒内完成(与预期完全一致),但到第8、第9和第10次呼叫返回时,大约需要8000-9000毫秒

当我在服务器上监视它时,每个线程都是唯一的,并且具有不同的线程ID,因此它不会与线程池发生冲突

我已将所有属性的服务限制设置为50

<serviceThrottling maxConcurrentCalls="50" maxConcurrentInstances="50" maxConcurrentSessions="50"/>


因此,我们看不出这可能会导致延迟。

您可能需要使用
ThreadPool.GetMinThreads
ThreadPool.SetMinThreads
方法检查并设置最小线程数

以下帖子虽然有点陈旧,但对我们的团队有所帮助,并可能为您提供宝贵的见解。

供参考:

首先,WCF使用托管I/O线程来处理请求。CLR线程池可以防止一定数量的空闲I/O线程被破坏。当需要更多的I/O线程时,它们由ThreadPool创建,这有点昂贵。空闲线程的数量由“MinIOThreads”设置指定。您可以使用ThreadPool.GetMinThreads()API检查应用程序的设置。默认情况下,在独立应用程序中,此设置是计算机上的CPU数量。例如,在我的双核笔记本电脑上,此设置为2。因此,您可能希望将此MinIOThreads设置与ThreadPool一起升级。SetMinThreads()

Thread.Sleep
不应在WCF中用于测试。这篇文章还包含了一些可能的解决方法。它在Windows服务中(尽管它也在控制台窗口中运行,这是我测试它的方式),你能找到它吗?我被困在这里描述的一个类似的问题上--。