Мне нужно запустить две задачи с помощью Parallel.ForEach
, но я хочу, чтобы первая завершилась, а затем затем запустилась вторая.
Parallel.Foreach(items, (item, state) =>
{
Task1(item);
Task2(item);
}
public void Task1(Item item)
{
var records = GetRecordsToExport();
UpdateFields1(records);
}
public void Task2(Item item)
{
var content = File.Read(...);
// read every line in content, and for every line update field DB
foreach(var c in content)
{
UpdateFields2(c); // different methods
}
}
Это код, я не могу выложить больше, так как код довольно большой
Task1
проверяет наличие некоторых записей в БД, которые нуждаются в обновлении, а Task2
проверяет наличие последних обновленных записей (из Task1) и обновляет их снова.
Изначально у меня были задачи наоборот, и я не мог понять, почему программа вылетает. Это связано с тем, что одна задача началась до завершения другой, и они работают с одними и теми же таблицами БД. Как я могу контролировать порядок запуска?
Task1
иTask2
не будут выполняться одновременно для одного и того жеitem
. Как вы написали,Task2
всегда будет запускаться послеTask1
, как и следовало ожидать. Наиболее вероятная проблема заключается в том, что код внутриTask1
иTask2
не является потокобезопасным. ИспользуяParallel.ForEach
, вы будете иметь многоTask1
иTask2
, работающих одновременно, но каждый из них будет работать для разныхitem
. Вы должны показать нам код дляTask1
иTask2
. - person J...   schedule 14.11.2014Task1
иTask2
для внутреннего использования? Пожалуйста, добавьте код для них обоих. - person Yuval Itzchakov   schedule 14.11.2014Task2
обновляет последнюю обновленную запись? но вы хотите обновить несколько записей одновременно? - person James Barrass   schedule 14.11.2014Parallel.Foreach(items, (item, state) => { Task1(item); } Parallel.Foreach(items, (item, state) => { Task2(item); }
- person Fabian H.   schedule 14.11.2014