2012-04-12 3 views
0

У меня есть такой situtation:Foreach ждать задачи закончить

 foreach (var item in listBoxFileNames.SelectedItems) 
     { 
      MessageBox.Show("I am not waiting"); 
      CancellationTokenSource tokenSourcve = new CancellationTokenSource(); 
      CancellationToken token = tokenSourcve.Token; 

      Task task1 = new Task(() => 
       { 
        ProcessDatas(); // method 
       } 
       , token); 

      task1.Start(); 
     } 

Я хочу сделать Еогеасп ждать завершения задачи. BUt это не ждет. Он показывает мне MessageBox сразу после каждого messagBox.

+0

Почему вы создаете задачу, если вы будете блокировать ожидание каждой задачи? –

+0

Пользователь выберет несколько файлов и выберет все файлы, которые он хочет обработать. foreach получит все выбранные элементы. Но он должен дождаться завершения предыдущей задачи. –

ответ

9

Да, вы начиная задачу, которая будет выполняться в фон. Если вы хотите, чтобы цикл работал полностью синхронно, просто вызовите ProcessDatas(), а не в задачу вообще. Вы могли бы запустить его, а затем дождаться его завершения - но неясно, какую выгоду вы дадите.

Если вы хотите начать все задачи параллельно, но ждать их после этого, вы можете создать List<Task>, а затем вызвать Task.WaitAll - или просто использовать Parallel.ForEach, чтобы начать с.

+0

Но окно меня не отвечает. –

+0

@FerhadJabiev: Неясно, что означает ваш комментарий, и какой поток ваш код работает, и чего вы пытаетесь достичь. –

+0

Не могли бы вы показать мне, что я должен изменить в своем коде? Почему Task.Wait() не работает в моем коде, если я объявляю его после task1.start(). Foreach is not waiting ... –

0

AFAIK вы можете просто позвонить USE по Task.Wait()

+0

İ уже использовал его. Это не ждет. –

0

Попробуйте этот код

task1.Wait(); 

и прочитать Task

+0

İ уже использовал его. Это не ждет. –

1

Не можете ли вы сделать Bool, который станет истинным после выполнения задачи, а затем оставит в цикле if (bool)?

+1

Вы говорите, что он должен делать что-то вроде 'while (! Finished) {/ * do nothing * /}'? Это ужасная идея, потому что она отнимает процессор, не делая бесполезной работы. – svick

+0

@svick Хорошо, я просто написал первое возможное решение, о котором я мог думать. Это была просто идея не законченная. Может быть, это было бы лучше в качестве комментария: P (новый здесь) – Charp

Смежные вопросы