在foreach循环中等待任务完成

时间:2019-08-25 19:32:52

标签: c# multithreading

我想等到下面的代码完成一个循环的执行,不要打算处理列表中的下一项直到完成一个。在以下情况下,如何确保一次foreach循环内执行一次或一次完成一个循环

请注意,这只是一个示例代码,目的只是为了演示问题,我知道如果我为每个循环删除Task.Run,​​它可能会起作用,但是我需要该任务。在foreach循环中运行我的代码中有某些原因。

List<int> Items = new List<int>();
Items.Add(1);
Items.Add(2);
Items.Add(3);

foreach(var itm in Items)
{
 Task.Run(() =>
       {
       MyFunction(itm);
       });

//  I want to wait here till one execution is complete, e.g till execution of Item with Value 1 is completed,  
//I dont' intend to execute next item value of 2 until processing with value 1 is completed.

}

private void MyFunction(int value)
{    
 Task.Factory.StartNew(() =>
    {
  MyFunction2(value);

    });

}


private void MyFunction2 (int number)
{
// do some ops 
// update UI

}

2 个答案:

答案 0 :(得分:2)

使用异步等待。 await允许您等待Task完成而不会阻塞线程(因此您的应用程序将不会冻结)

foreach(var itm in Items)
{
    await MyFunction(itm);
}

// you must return Task to await it. void won't work
private Task MyFunction(int value)
{
    // Task.Run is preferred over Task.Factory.StartNew,
    // although it won't make any difference
    return Task.Run(() => MyFunction2(value));
}

也不要忘记使该方法包含foreach循环async Task。您只能使用async方法来等待任务。返回类型应为Task,以便稍后可以等待它并可能捕获异常。除非方法是事件处理程序,否则请避免使用async void

public async Task Foo()
{
    foreach(var itm in Items)
    {
        await MyFunction(itm);
    }
}

答案 1 :(得分:-3)

Task.Run返回代表该工作的Task对象。您需要致电等待。

 var myTask = Task.Run(() =>
   {
   MyFunction(itm);
   });
  myTask.Wait();