2012-04-12 175 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(); 
     } 

我想要的foreach等任务的完成。它不在等待。它在每个messagBox后立即向我显示MessageBox。

+0

如果您将阻止等待每项任务,为什么要创建任务? – 2012-04-12 11:34:20

+0

用户将选择一些文件并选择他想要处理的所有文件。 foreach将获得所有选定的项目。但它必须等待以前的任务完成。 – 2012-04-12 11:38:09

回答

9

是的,你是开始的任务,然后将执行的背景。如果你想让循环完全同步,只需调用ProcessDatas()就不在任务中。你可能启动它,然后等待它完成 - 但它不清楚会给你什么好处。

如果你想开始所有并行的任务,但随后等待他们之后,你可以创建一个List<Task>,然后调用Task.WaitAll - 或者只是使用Parallel.ForEach开始。

+0

但窗口没有回应我。 – 2012-04-12 11:36:53

+0

@FerhadJabiyev:目前还不清楚你的评论意味着什么,也不清楚你的代码运行在哪个线程中,也不知道你想要实现什么。 – 2012-04-12 11:38:08

+0

你能告诉我我的代码中必须改变什么吗?为什么Task.Wait()不在我的代码中工作,如果我在task1.start()之后加上它。 Foreach没有等待...... – 2012-04-12 11:49:16

0

AFAIK你可以调用Task.Wait()

+0

©已经使用过它。 İt不在等待。 – 2012-04-12 11:34:11

0

尝试使用此代码

task1.Wait(); 

和阅读本Task

+0

©已经使用它。 İt不在等待。 – 2012-04-12 11:34:36

1

一旦完成任务,你不能让一个Bool成为true,然后把其余部分放在if(bool)循环中吗?

+1

你是说他应该做些什么像'while(!finished){/ *什么都不做* /}'?这是一个可怕的想法,因为它浪费CPU不做无用的工作。 – svick 2012-04-12 12:14:29

+0

@svick好的,我刚写下了我能想到的第一个可能的解决方案。这只是一个想法,不是一个完成的答案。也许它会更适合作为评论:P(new here) – Charp 2012-04-13 10:44:34