【发布时间】:2017-02-07 10:24:18
【问题描述】:
我通过 ServiceHost 将 InstanceContextMode 设置为 PerSession/PerCall
Description.Behaviors.Find<ServiceBehaviorAttribute>().InstanceContextMode = InstanceContextMode.PerSession;
Description.Behaviors.Find<ServiceBehaviorAttribute>().UseSynchronizationContext = false;
ServiceThrottlingBehavior stb = new ServiceThrottlingBehavior
{
MaxConcurrentSessions = 1000,
MaxConcurrentCalls = 1000,
MaxConcurrentInstances = 1000
};
Description.Behaviors.Add(stb);
每次调用都会创建新的服务实例。但是,据我所知,WCF 服务使用 ThreadPool 中的线程,这些请求将排队到可用线程,直到它决定启动新线程。当有一个服务长时间运行时,它会阻止(一些?)后续请求被处理。
我什至尝试将 ThreadPool.SetMaxThreads() 和 ThreadPool.SetMinThreads() 设置为高值,但仍然没有成功。
那么,处理这类问题有什么好的做法呢?
编辑:我尝试了 PerSession/PerCall 与 ConcurrencyMode 的不同组合,但它不起作用。当我在 IIS 设置中提高数量或最大工作进程时,它唯一的非阻塞
一段时间后编辑:现在我知道不建议在 WCF 服务中运行长时间运行的操作,因为它使用 ThreadPool。由于一个阻塞请求将导致所有后续请求(自动排队到某个有限的线程数量,直到 ThreadPool 决定它应该产生更多线程)。所以我把它留给面临同样问题的人。
【问题讨论】:
-
什么是来自同一客户端或其他客户端请求的阻止请求?你的消息传递模式是什么?请求/回复、双工等?
-
我很确定它只针对同一个客户端被阻止
-
我使用了默认的消息模式(我相信是 Request/Reply ?)
-
您确定这是 WCF 问题吗?也许请求正在使用数据库,而您正面临数据库锁定问题?
-
阻塞其他请求的请求是对外部服务的宁静调用。这就是为什么它花了这么长时间@zmbq