Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对单个wcf服务进行多个并发调用的最佳方法_C#_Multithreading_Wcf_Client - Fatal编程技术网

C# 对单个wcf服务进行多个并发调用的最佳方法

C# 对单个wcf服务进行多个并发调用的最佳方法,c#,multithreading,wcf,client,C#,Multithreading,Wcf,Client,我正在制作一个需要处理大量数据(6MM记录或更多)的windows应用程序,调用WCF服务 为此,我使用Parallel.Foreach对服务进行多个连接 我的app.config中包含以下内容以允许多个服务器连接: <system.net> <connectionManagement> <add address="*" maxconnection="100" /> </connectionManagement>

我正在制作一个需要处理大量数据(6MM记录或更多)的windows应用程序,调用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);
});
Parallel.ForEach(列表,(项目,循环状态)=>
{
ServiceAClient客户端=新ServiceAClient();
var数据=GetDataFromDB(项目);
客户流程(数据);
});
使用上面的代码,每秒处理大约40到50个项目,这很好,但内存一直在增加,直到占用了所有系统内存并阻止了应用程序

因此,我尝试在一段时间后使用计时器(45秒)调用垃圾收集器。这样一来,在调用GC.Collect()之后,内存使用率降低了,但速度不够快。我想更频繁地调用GC,但我知道这不是一个好主意,可能会增加应用程序的开销

所以,我修改了代码来处理客户端,如下所示

Parallel.ForEach<ItemType>(list, (item, loopState) =>
    {
        using(ServiceAClient client = new ServiceAClient())
        {
             var data = GetDataFromDB(item);
             client.Process(data);
        }
    });
Parallel.ForEach(列表,(项目,循环状态)=>
{
使用(ServiceAClient client=new ServiceAClient())
{
var数据=GetDataFromDB(项目);
客户流程(数据);
}
});
在begging,一切都很好,内存没有开始增加并保持在同一水平,到目前为止还不错,但过了一段时间(几分钟或几个小时),一切都开始变得非常缓慢,每秒只处理一个项目,但内存使用率仍然很低


发生了什么事?关闭通道的开销是否会使其变慢?我是否应该使用一个客户端对服务进行所有调用?这将限制到服务的连接数?

您是否只尝试了一个静态
客户端
?你用档案器调查过你的记忆吗?这是问题的一部分。如果我应该对所有请求使用单个客户端,但我不知道这是否会减少到服务器的活动连接数。我确实用探查器调查了内存,这就是我如何认识到客户机就是消耗内存的对象的原因。在Dispose之前,应该在客户机上显式调用Close/Abort(Close可能抛出)。详情如下: