各ループでParallelを停止するのに問題があります。Parallel.ForEachをすぐに停止
テーブルから取得した約40.000個のDataRowsのセットを反復処理しています。結果セットに100個のアイテムがあるとすぐにループを停止する必要があります。問題は、ParallelLoopStateでStopメソッドをトリガーすると、イテレーションが即座に停止せず、結果セットに矛盾が発生することです。
私は停止を押すとすぐに、私はすべてのスレッドを殺すことを確認する方法はありませんか?
List<DataRow> rows = new List<DataRow>(dataTable.Select());
ConcurrentDictionary<string, object> resultSet = new ConcurrentDictionary<string, object>();
rows.EachParallel(delegate (DataRow row, ParallelLoopState state)
{
if (!state.IsStopped)
{
using (SqlConnection sqlConnection = new SqlConnection(Global.ConnStr))
{
sqlConnection.Open();
//{
// Do some processing.......
//}
var sourceKey = "key retrieved from processing";
if (!resultSet.ContainsKey(sourceKey))
{
object myCustomObj = new object();
resultSet.AddOrUpdate(
sourceKey,
myCustomObj,
(key, oldValue) => myCustomObj);
}
if (resultSet.Values.Count == 100)
state.Stop();
}
}
});
*なぜ* SQLコマンドを並列実行しようとしていますか?これにより、悪いクエリがより速く実行されることはありません。あなたの*実際の*問題は何ですか? –
メソッド –
BTW 40K行でのロックの使用は全くデータがありません。あなたが100だけを望むときには40Kのすべてを読み込みますが、バグです。なぜあなたは 'SELECT TOP 100'を使わないのですか? –