我制作的Windows应用程序必须处理大量数据(6MM或更多记录),并调用WCF服务。
为此,我使用Parallel.Foreach为服务制作多个连接。
我在app.config中有以下内容以允许多个连接到服务器:
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
首先,我尝试使用以下代码:
Parallel.ForEach<ItemType>(list, (item, loopState) =>
{
ServiceAClient client = new ServiceAClient();
var data = GetDataFromDB(item);
client.Process(data);
});
使用上面的代码,每秒处理大约40到50个项目,这很好,但内存一直在上升,直到它占用了所有系统内存并阻止了应用程序。
所以,我尝试使用计时器(45秒)一段时间后调用垃圾收集器。有了这个,GC.Collect()被调用后内存使用量减少了,但还不够快。我想更频繁地调用GC,但我知道这不是一个好主意,可能会在
中增加应用程序所以,我改变了代码来处理客户端,看起来像这样
Parallel.ForEach<ItemType>(list, (item, loopState) =>
{
using(ServiceAClient client = new ServiceAClient())
{
var data = GetDataFromDB(item);
client.Process(data);
}
});
在乞讨时一切正常,记忆没有开始增加并保持在同一水平,到目前为止一直很好,但过了一会儿(几分钟或几个小时),一切都开始变得非常缓慢每秒仅执行一项,但内存使用量仍然很低。
发生了什么事?关闭频道的开销是否会变慢?我应该使用单个客户端来拨打所有服务吗?那会限制服务的连接数量吗?