我想等到下面的代码完成一个循环的执行,不要打算处理列表中的下一项直到完成一个。在以下情况下,如何确保一次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
}
答案 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();