我使用basicHttpBinding
的安全模式为TransportWithMessageCredential
的WCF服务。我正在调查我们的一些客户正在获得的超时问题。我已经编写了一个小测试应用程序,它可以在客户端上创建多个线程,并简化了一个简单的操作。呼叫服务器,该服务器除了Thread.Sleep
以外什么都不做。
当我运行这个测试应用程序时,它会创建10个线程,使用远程方法实例化对象,然后调用它(告诉它睡5秒(5000毫秒))。
我还尝试了多种线程变化和“睡眠”。在服务器上的时间,我发现在正确的时间内返回前3或4,但后续的都需要更长的时间。
1:12:13.197 Starting Test - Multi1
1:12:13.199 Starting Test - Multi2
1:12:13.203 Starting Test - Multi3
1:12:13.228 Starting Test - Multi4
1:12:13.367 Got connection object - Multi3
1:12:13.368 Starting Test - Multi5
1:12:13.368 Got connection object - Multi1
1:12:13.369 Got connection object - Multi4
1:12:13.369 Got connection object - Multi2
1:12:13.391 Starting Test - Multi6
1:12:13.394 Starting Test - Multi7
1:12:13.398 Starting Test - Multi8
1:12:13.531 Got connection object - Multi5
1:12:13.532 Starting Test - Multi9
1:12:13.533 Got connection object - Multi7
1:12:13.535 Got connection object - Multi6
1:12:13.539 Starting Test - Multi10
1:12:13.565 Got connection object - Multi8
1:12:13.687 Got connection object - Multi9
1:12:13.691 Got connection object - Multi10
1:12:18.396 Ended Test - Multi3
1:12:18.396 Ended Test - Multi4
1:12:18.844 Ended Test - Multi2
1:12:19.345 Ended Test - Multi1
1:12:19.844 Ended Test - Multi5
1:12:20.344 Ended Test - Multi7
1:12:20.844 Ended Test - Multi6
1:12:21.349 Ended Test - Multi8
1:12:21.844 Ended Test - Multi9
1:12:22.344 Ended Test - Multi10
因此,根据上述结果,您可以看到所有线程都已创建,并且'连接对象'得到了。这需要大约500毫秒,考虑到它在做什么,这不是太糟糕。
然后测试Multi3
和Multi4
在大约5000毫秒内完成(完全符合预期),但是当第8,9和10次呼叫回来时,它们大约需要8000-9000毫秒。
当我在服务器上监视它时,每个线程都是唯一的,并且具有不同的threadId,因此它不会与线程池作斗争。
我将所有属性的服务限制设置为50.
<serviceThrottling maxConcurrentCalls="50" maxConcurrentInstances="50" maxConcurrentSessions="50"/>
因此无法看到这可能导致延迟。
答案 0 :(得分:1)
您可能需要使用ThreadPool.GetMinThreads
和ThreadPool.SetMinThreads
方法检查然后设置最小线程数。
以下文章虽然有点陈旧,但对我们的团队有所帮助,可能会为您提供宝贵的见解 http://blogs.msdn.com/b/wenlong/archive/2010/02/11/why-are-wcf-responses-slow-and-setminthreads-does-not-work.aspx
供参考:
首先,WCF使用托管I / O线程来处理请求。 CLR ThreadPool保持一定数量的空闲I / O线程不被破坏。当需要更多I / O线程时,它们由ThreadPool创建,这是一种昂贵的。空闲线程数由“MinIOThreads”设置指定。您可以使用ThreadPool.GetMinThreads()API来检查您的应用程序的设置。默认情况下,在独立应用程序中,此设置是计算机上的CPU数。例如,在我的2核心笔记本电脑上,此设置为2.因此,您需要使用ThreadPool.SetMinThreads()