У меня есть проблема с остановкой параллели для каждого цикла.stop Параллельный.ForEach немедленно
Я повторяю набор из около 40.000 DataRows, извлеченных из таблицы, и мне нужно немедленно остановить цикл, когда у меня есть 100 элементов в моем наборе результатов. Проблема в том, что когда я запускаю метод Stop на ParallelLoopState, итерация не останавливается немедленно, вызывая несогласованность в моем наборе результатов (либо до нескольких, либо ко многим элементам).
Нет ли способа убедиться, что я убью все потоки, как только я нажму стоп?
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 строк нет данных вообще. Загрузка всех 40K из них, когда вам нужно всего лишь 100, является ошибкой. Почему бы вам просто не использовать «SELECT TOP 100»? –