我们有一个 C# (.Net 4.0) 控制台应用程序,它“自托管”两个 WCF 服务:一个 used WSHttpBinding
,另一个使用BasicHttpBinding
.
连接到这些服务后,我们有两个独立的客户端应用程序:一个BasicHttpBinding
使用WSHttpBinding
.
WCF 服务应用程序通常有大约 30 个用户通过 Silverlight 客户端连接,另外几个来自控制台应用程序客户端的连接。无论如何,它都不是“平淡无奇”。每个客户端最多每 5 秒查询一次 WCF 服务。
问题是:服务应用程序间歇性地变得无响应。尽管服务器本身继续运行(它继续写入日志文件),但所有 WCF 活动(在两个ServiceHost
s 上)似乎都“占用”了。不处理新请求(尽管接受 TCP 连接)。此外,应用程序消耗的线程数开始急剧增加,大约每秒一个新线程。代码本身不会对Thread
s 或ThreadPool
s 做任何事情,尽管它偶尔会发出Thread.Sleep
几百毫秒的 a。
令人沮丧的是问题的间歇性:代码定期运行数小时,甚至数天而没有任何问题。然后,在没有明显原因的情况下,它突然变得无响应并且线程数开始增加。
我尝试过模拟用户活动——连接和断开客户端,用请求“淹没”服务——但我无法重现故障。
以防万一问题是 WCF 限制,我添加了以下代码:
ServiceThrottlingBehavior throttlingBehavior = new System.ServiceModel.Description.ServiceThrottlingBehavior
{
MaxConcurrentCalls = 512,
MaxConcurrentInstances = 8192,
MaxConcurrentSessions = 8192
};
host.Description.Behaviors.Add(throttlingBehavior);
host2.Description.Behaviors.Add(throttlingBehavior);
..没有明显效果。
我已经在代码中进行了大量日志记录,以尝试确定触发此行为的原因 - 记录对每个方法的每次调用 - 但结果没有出现任何结果。我已经将所有内容都包装在try
...catch
块中,并将任何异常吐出到日志文件中,以查看是否有什么东西掉到了某个地方,并UnhandledException
以类似的方式将 s 困住了……但再一次,似乎没有任何问题。
上述行为是否对任何人来说都很熟悉,或者任何人都可以建议解决此问题的最佳方法吗?
编辑:按照下面 Wal 的建议,当应用程序开始出现异常行为时,我已经捕获了应用程序的 .DMP,并查看了 VS2012 中的 Parallel Stacks 视图,我看到:
...和其他非常相似但线程数不同的。我不够聪明,无法准确解读这意味着什么……有人可以建议下一步从哪里开始寻找吗?