2016-08-16 14 views
0

私の質問はParallel Foreach Race Conditionパラレルforeachのカウント

にたくさん似ていますが、それは非常に明確に答え、それは私がのために、それぞれには、一定の基準を満たしているオブジェクトカウントする必要があるという意味で異なっていませんでした。そうであれば、それをリストに追加する必要があります。

そうだから、明らかにこのリストは、それぞれの通常の私は、スレッドロックか何かのように、同期してMetCriteriaオブジェクトを保持するためにいくつかの方法が必要となるため、すべての値が含まれていません。この

List<int> MetCriteria = new List<int>(); 
Parallel.ForEach(dt.AsEnumerable(), (entry,state) => { 

    if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds 
    MetCriteria.add(Convert.ToInt32(entry["EntryID"]); 
}); 

のようなものしかし、私は

+0

'if'ステートメントはあなたがしようとしているものですか?もしそうなら、あなたはなぜ並列処理を使用していますか? – Enigmativity

+0

私は金額に基づいて別のことをしなければならないので、100を超える場合、他の変数をチェックする必要がなく、別のリストに追加する必要がある場合は基準を満たします。エントリ時間に基づいて時間がかかる可能性のあるエントリごとにWebサービスを呼び出す必要があります – Neil

+0

'Convert.ToInt32(entry [" Time "])> 100'のような値を単純に比較して、その後、Webサービスを呼び出すことができますか?あるいは 'if'の中でWebサービスを呼び出していますか? – Enigmativity

答えて

1

あなたはConcurrentBagのようなスレッドセーフなコレクションを使用することができますしてください。この

任意のヘルプを行う方法がわからないと思います。

var MetCriteria = new ConcurrentBag<int>(); 
Parallel.ForEach(dt.AsEnumerable(), (entry,state) => { 

    if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds 
    MetCriteria.add(Convert.ToInt32(entry["EntryID"]); 
}); 
1

確かにあなたのリストを脅威に耐えるようにロックすることができます。しかし、私はDovydas Sopaのようなスレッドセーフなコレクションを使用します。

List<int> MetCriteria = new List<int>(); 
Parallel.ForEach(dt.AsEnumerable(), (entry, state) => 
{ 
    if (Convert.ToInt32(entry["Time"]) > 100)//in miliseconds 
    { 
     lock (MetCriteria) 
     { 
      MetCriteria.Add(Convert.ToInt32(entry["EntryID"])); 
     } 

    } 
}); 
+0

どちらがよりリソースにやさしいでしょうか。この答えまたはDovydas Sopaの – Neil

+0

私はあなたの答えを使用していた場合、私はif(MetCriteria.count> 1000) 'のようにそれが正しい(そのちょうどデータを読み取って、変更されていない) ? – Neil

+2

Dovydas Sopaの答えを受け入れる、これはどうやってやるべきかです。ロックは、異なるスレッドからの同時アクセスを防ぎ、_thread safe_にします。技術的には、オブジェクトはロックされていて、別のアクセススレッドは前のアクションが完了するまで待たなければなりません。 – fubo