Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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# 如何优化和加速此操作 List customers=GetCustomers(“ACT”); Foreach(客户中的var客户) { 保存客户数据(客户); }_C#_Parallel Processing - Fatal编程技术网

C# 如何优化和加速此操作 List customers=GetCustomers(“ACT”); Foreach(客户中的var客户) { 保存客户数据(客户); }

C# 如何优化和加速此操作 List customers=GetCustomers(“ACT”); Foreach(客户中的var客户) { 保存客户数据(客户); },c#,parallel-processing,C#,Parallel Processing,现在在这个操作中,我得到了一个客户对象列表,可以是数千个,然后将每个客户对象逐个保存到数据库中。 是否有一种方法可以加速或以某种方式使其并行,以真正实现性能和正确的结果。创建一个以许多客户为参数的存储过程。与所有客户一起调用此过程一次。一次网络点击。列出客户=获取客户(“ACT”); List<Customer> customers = GetCustomers("ACT"); Foreach(var customer in customers) { SaveCustomerDa

现在在这个操作中,我得到了一个客户对象列表,可以是数千个,然后将每个客户对象逐个保存到数据库中。
是否有一种方法可以加速或以某种方式使其并行,以真正实现性能和正确的结果。

创建一个以许多客户为参数的存储过程。与所有客户一起调用此过程一次。一次网络点击。

列出客户=获取客户(“ACT”);
List<Customer> customers = GetCustomers("ACT");
Foreach(var customer in customers)
{
  SaveCustomerData (customer);
}
Task[]tasks=新任务[MaxNumOfConcurrentSaves]; While(customers.Length>0) { 对于(int i=0;i!(aCust==null)); 任务。等待所有(任务) }
好的,下面是发生的情况(您必须根据自己的用途对其进行完善):虽然列表中有客户,但对于从开始到最大并发任务数的每个客户,启动任务以保存并将该客户设置为null。然后,在for循环结束后,找到列表中所有不为null的客户条目,并保留它们,等待任务完成。如果列表中没有剩余内容,则循环结束,保存过程完成。SaveCustomerData将返回执行实际保存代码的任务

如果任何人发现此代码有问题,请编辑或提请我注意。我没有在这个能力下测试过它,但它与我所做的工作类似

编辑:

我最近在.NET4.5中发现了这个任务的惊人之处(可能也是4,不确定)

List customers=GetCustomers(“ACT”);
Parallel.ForEach(客户,(currentCustomer)=>SaveCustomerData(currentCustomer))

同样,一行多线程。

我建议您查看async和Wait关键字。您需要的是一系列任务或操作,这些任务或操作在开始更多操作之前等待完成。您正在尝试对应用程序进行多线程处理,这需要了解与之相关的问题,如竞争条件。当然,在网络上进行一次。但我想知道单个客户对象占用多少字节?这可能导致网络上的数据一次性达到千兆字节。如果是这样的话,情况会更糟。我希望拥有数千万客户的用户不会使用堆栈溢出来发现如何一次性更新所有客户!。我还希望不要同时将数百万客户都存储在内存中,更新他们,将他们写入数据库并抱怨这需要很长时间)是的,我也这样做——尽管这仍然取决于客户内存占用的大小。这也无法实现OP的目标。例如,现在您依赖数据库服务器来处理任务。如果这有助于解决您的问题,请将其标记为所选答案。如果没有,请创建一个,然后标记它。标记为。谢谢关于Task.AwaitAll()的另一个问题是,如何捕获异常并使用客户编号记录特定的异常。我可以在save函数中设置一个try-catch-around任务。使用文件.Append()创建一个日志对象,并将其记录到两个文件中:一个用于特定的客户保存运行,另一个用于所有失败的客户。或者使用控制台(如果可用)。
List<Customer> customers = GetCustomers("ACT");
Task[] tasks = new Task[MaxNumOfConcurrentSaves];
While(customers.Length > 0)
{
     for(int i = 0; i < MaxNumOfConcurrentTasks; i++){
            tasks[i] = SaveCustomerData(customers[i]);
            customers[i] = null;
     }
     customers = List.FindAll<Customer>(customers, aCust => !(aCust == null));
     Task.AwaitAll(tasks)
}
List<Customer> customers = GetCustomers("ACT");
Parallel.ForEach(customers, (currentCustomer) => SaveCustomerData(currentCustomer))