2

tblCustomer からのデータをループして、アドレスが有効かどうかを確認しています。そうでない場合は、これを返品リストに追加します。問題は、検証する行が 37000 行あります。検証は外部ライブラリを介して行われます。約1時間かかります。これをスレッド化したいので、はるかに高速に実行できます。誰かが私がそれを書き直すのを手伝ってもらえますか? また、これを並列クラス for または 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;
4

1 に答える 1

1
  1. ParallelOptionsクラスの MaxDegreeOfParallelism プロパティを使用して、スレッドの数を制御できます。

    ParallelOptions.MaxDegreeOfParallelism = 5; //同時スレッド数を 5 に制限する

  2. Partitioner<> オブジェクトをパラメーターとして受け取る ForEach()オーバーロードを使用して、パーティショニングを制御できます。

    これは、パーティショニングの例を含む素晴らしい記事です

  3. おそらくパフォーマンスはさらに向上しますが、実際に試してみるまではどの程度かを知ることは困難です.

注: 複数のスレッドの使用を開始する場合は、すべての共有オブジェクト/リストがスレッドセーフであることを確認してください。たとえば、顧客リストをロックするか、ConcurrentCollections 名前空間のコレクションを使用する必要があります。PCM メソッドはスレッドセーフですか?

于 2012-10-28T02:00:10.787 に答える