c# - WCF 是否使用 ThreadPool 为 PerCall 服务创建新实例?

标签 c# .net multithreading wcf

对于节流设置为高的 PerCall WCF 服务(例如,最多 200 个并发调用),WCF 会启动一个新实例并在线程池线程上调用请求吗?

如果是,那么这对允许的并发调用总数有影响吗?

我问是因为我似乎从来没有达到我在服务节流配置中设置的最大并发调用数,而是该数字的一小部分 - 在 100 MaxConcurrentCalls 设置上最多 50 个,在 200 个上最多 160 个MaxConcurrentCalls 设置。

谢谢,

最佳答案

WCF 似乎使用 CLR 线程池中的托管 I/O 线程来为请求提供服务,但需要注意的是使用其自己的线程调度程序。

来自 Wenlong Dong's Blog - Why Are WCF Responses Slow and SetMinThreads Does Not Work?

First of all, WCF uses managed I/O threads to handle requests. The CLR ThreadPool keeps a certain number of idle I/O threads from being destroyed. When more I/O threads are needed, they are created by the ThreadPool, which is kind of expensive.

来自 Wenlong Dong's Blog : WCF Request Throttling and Server Scalability

In .NET 3.0 and 3.5, there is a special behavior that you would observe for IIS-hosted WCF services. Whenever a request comes in, the system would use two threads to process the request: One thread is the CLR ThreadPool thread which is the worker thread that comes from ASP.NET. Another thread is an I/O thread that is managed by the WCF IOThreadScheduler (actually created by ThreadPool.UnsafeQueueNativeOverlapped).

影响 WCF 吞吐量的设置过多。因为 WCF 使用托管 ThreadPool,ThreadPool 的 MinIOThreads 和 MaxIOThreads 设置将影响结果。从 ThreadPool 中取出所有空闲 I/O 线程(或工作线程,如果您正在使用这些线程)后,ThreadPool 将延迟一段时间,然后启动一个新线程来为排队的请求提供服务。通过增加 MinIOThreads,您可以防止这种延迟。如果您达到 MaxIOThread 限制,那肯定会限制您看到的并发请求数;但是,在您的 50/100 测试中情况似乎并非如此,因为您的下一个测试设法让 160 个并发请求运行。如果我没记错的话,我相信您使用的托管环境(IIS、WAS、自身)可以决定一些 ThreadPool 设置。此外,如果您从第二个链接阅读博客文章,您将看到当 WCF 在其单独的 I/O 线程上处理请求时,IIS 工作线程如何被阻塞。因此在这种情况下,工作线程设置和 IIS 设置会对 WCF 并发产生影响。您如何托管此服务?

您的标题提到了 PerCall InstanceContextMode,这将使 ConcurrencyMode 变得无关紧要。但是,对于 PerCall,您需要了解 MaxConcurrentInstances 设置以及 MaxConcurrentCalls。根据您的绑定(bind),您可能还需要关注 MaxConcurrentSessions 属性。您使用什么绑定(bind)来托管此服务?

不管以上所有情况,令人困惑的是 50/100 测试之后的 160/200 测试。

关于c# - WCF 是否使用 ThreadPool 为 PerCall 服务创建新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2835595/

相关文章:

c# - 是否可以使用 .Net 框架以编程方式记录对 Windows 共享(SMB 共享)的访问?

c# - 具有非常慢的 CreateViewStream 的 MemoryMappedFile

c# - .NET 源代码中定义的关键字的位置

具有延迟事件通知的 C# 作业队列实现

c# - 线程在 2 分钟后什么都不做

c# - 使用 session ID 将消息添加到 IAsyncCollector 主题输出

.net - 闪烁且 "CreateParams"

c# - Silverlight - 是否可以在后台线程上创建 UI 元素?

c++ - C++ 中的跨平台多线程?

c# - ConfigureAwait(false) 导致错误而不是死锁的情况