簡體   English   中英

如何優化和加速這個操作

[英]How to optimize and speed up this operation

List<Customer> customers = GetCustomers("ACT");
Foreach(var customer in customers)
{
  SaveCustomerData (customer);
}

現在在這個操作中 - 我得到一個客戶對象列表,它可以是數千個,然后將每個客戶對象一個一個地保存在數據庫中。 有沒有辦法可以加速或以某種方式使其並行以真正實現性能和正確的結果。

創建一個將許多客戶作為參數的存儲過程。 與所有客戶一起調用此程序一次。 一網打盡。

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)
}

好的,這是發生的事情(您必須完善它以供您使用):雖然我們在列表中有客戶,但對於從開始到最大並發任務數的每個客戶,啟動任務以保存並將該客戶設置為空。 然后,在 for 循環結束后,找到列表中所有不為空的客戶條目並保留它們並等待任務完成。 如果列表中沒有任何內容,則循環結束並且保存過程完成。 SaveCustomerData 將返回一個執行實際保存代碼的任務。

如果有人發現此代碼有問題,請編輯或提請我注意。 我沒有以這種能力測試過它,但它類似於我所做的工作。

編輯:

我最近在 .Net 4.5 中發現了這項任務的驚人之處(也許也是 4,不確定)

List<Customer> customers = GetCustomers("ACT");
Parallel.ForEach(customers, (currentCustomer) => SaveCustomerData(currentCustomer))

同樣的事情,多線程在一行中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM