2012-10-28 116 views
2

我正在循環來自tblCustomer的數據並檢查地址是否有效。如果沒有,那麼我將它添加到我的返回列表中。 這個問題有37000行需要驗證。驗證通過外部庫完成。這需要約1小時。我想這樣做,所以我可以做得更快。 有人可以幫我改寫它嗎?此外,我還在某處閱讀並行課程或foreach。我想知道的幾件事 -通過並行運行foreach循環來構建結果列表

  1. 它會創建多少個線程?我們如何控制這一點?

  2. 我們可以說每個線程會處理多少條記錄嗎?

  3. 我覺得最隱含的問題是:這個DLL有靜態類來驗證地址。當我把它分解成線程時,它會給我帶來什麼性能增益嗎?還是需要同一時間?


List<tblCustomer> customers = new List<tblCustomer>(); 
      int i = 0; 
      foreach (var customer in DataContext.tblCustomers) 
      { 
       string addressToValidate = string.Format("{0}, {1}; {2} {3}", GetSafeString(customer.MailingCity), GetSafeString(customer.MailingState), GetSafeString(customer.MailingAddress), GetSafeString(customer.MailingAddress2)); 
       isTripValid = PCM.PCMSAddStop(tripId, addressToValidate.Trim()) == 1; 
       if (!isTripValid) 
       { 
        customers.Add(customer); 
       } 
       i++; 
       if (i == 1000) 
       { 
        PCM.PCMSClearStops(tripId); 
        i = 0; 
       } 
      } 
      PCM.PCMSCloseServer(serverID); 
      PCM.PCMSDeleteTrip(tripId); 

      return customers; 
+0

http://msdn.microsoft.com/en-us/library/hh156513.aspx應該能夠提供幫助。 –

+0

異步不是我正在尋找的。即使UI線程被鎖定了幾分鐘,我也沒有問題。只要速度很快。現在需要60分鐘。 :( –

回答

1
  1. 您可以控制使用的ParallelOptions類MaxDegreeOfParallelism財產的線程數。

    ParallelOptions.MaxDegreeOfParallelism = 5; //將併發線程數限制爲5

  2. 您可以使用以分區器<>對象爲參數的ForEach()過載來控制分區。

    Here's a great article with an example on partitioning

  3. 它可能仍然會提高你的表現,但很難知道多少,直到你試試吧。

注意:如果您要開始使用多個線程,請確保所有共享對象/列表都是線程安全的。例如,您需要鎖定客戶列表或使用ConcurrentCollections命名空間中的集合。 PCM方法是線程安全的嗎?

+0

從我的理解,他們是線程安全的。你能告訴我你在1和2說的代碼的例子嗎? –

+0

我實際上沒有寫我自己的分區器,但我已經把一個鏈接到一個有很多關於它的文章,有例子,希望有幫助 –

+0

有沒有人有一個類似於我的問題的例子,並得到它的工作? –