Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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# Dynamics CRM中批量导入数据时的性能问题_C#_Task Parallel Library_Dynamics Crm - Fatal编程技术网

C# Dynamics CRM中批量导入数据时的性能问题

C# Dynamics CRM中批量导入数据时的性能问题,c#,task-parallel-library,dynamics-crm,C#,Task Parallel Library,Dynamics Crm,我正在使用C#控制台应用程序将数据导入Dynamics CRM。我正在使用以下代码: public static void Main(string[] args) { int totalRecords = dbcon.GetDataCount(); int rowCount = totalRecords / 10; for (int i = 1, j = 1; i <= totalRecords; i

我正在使用C#控制台应用程序将数据导入Dynamics CRM。我正在使用以下代码:

    public static void Main(string[] args)
    {
            int totalRecords = dbcon.GetDataCount();
            int rowCount = totalRecords / 10;

            for (int i = 1, j = 1; i <= totalRecords; i = i + rowCount, j = j + 1)
            {
                Task myTask = new Task(() => TestMethod(i, (rowCount * j)));
                myTask.Start();
            }
          Task.WaitAll();
     }


public static void TestMethod(int startSeqNo, int endSeqNo)
{            
   IOrganizationService service = getServiceProxcy();
    DBConnection dbcon = new DBConnection();
    DataTable dt = dbcon.GetData(startSeqNo, endSeqNo);
    // Insert Commented
    BulkCreate(service, dt);    
 }



public static void BulkCreate(IOrganizationService service, DataTable dt)
{
  // Create an ExecuteMultipleRequest object.
  ExecuteMultipleRequest multipleRequest = new ExecuteMultipleRequest()
  {
    // Assign settings that define execution behavior: continue on error, return responses. 
    Settings = new ExecuteMultipleSettings()
    {
        ContinueOnError = false,
        ReturnResponses = true
    },
    // Create an empty organization request collection.
    Requests = new OrganizationRequestCollection()
};

foreach (DataRow row in dt.Rows)
{
    Entity entity = new Entity("new_dataimporttest");
    entity["new_name"] = row["name"].ToString();
    entity["new_telephone"] = row["telephone1"].ToString();
    if (multipleRequest.Requests.Count == 1000)
    {
        // Execute all the requests in the request collection using a single web method call.
        ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
        multipleRequest.Requests.Clear();
    }
    CreateRequest createRequest = new CreateRequest { Target = entity };
    multipleRequest.Requests.Add(createRequest);        
}

// Execute all the requests in the request collection using a single web method call.
if (multipleRequest.Requests.Count > 0)
{
    ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
}
}
我想提高代码的性能,因为我正在导入大量数据,将近一百万条记录。目前需要1小时50分钟。如何改进代码以减少执行时间。

  • 您可以让两个方法在同一个过程中执行multiplerequest(每个500个),使用它们可以将时间减少一半
  • 分析在执行或foreach创建过程中哪个部分会浪费更多时间。写在这里,这样我才能更好地帮助你

使用
ExecuteMultipleRequest
只能以有限的方式提高数据吞吐量。这是因为Dynamics CRM服务器按顺序处理其中的请求,而不是并行处理。因此,您的主要收益是减少到服务器的往返次数

当使用多个线程时,吞吐量确实可以提高。与CRM通信的每个线程都必须有自己的
ioOrganizationService
实例。默认情况下,CRM服务器最多可同时接受来自客户端的10个连接。(这是WCF默认设置。)


在批处理过程中,我倾向于使用生产者-消费者模式的
BlockingCollection
:一个线程生成要发送到CRM服务器的请求,多个线程通过将请求从集合中取出并发送到CRM来消费这些请求。

如果此处只需要数据导入,尝试使用SqlBulkCopy将数据直接写入服务器()

对于Dynamics CRM,这是一种不受支持的技术。
// Execute all the requests in the request collection using a single web method call.
    //            ExecuteMultipleResponse multipleResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);