我需要使用3个任务创建一个foreach循环,这需要等到所有3个任务完成后再移动到下一个任务。 像
这样的东西foreach (class r in sets)
{
Task.Factory.StartNew(() => {
DoThisFunction1();
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() => {
DoThisFunction2();
}, TaskCreationOptions.LongRunning);
Task.Factory.StartNew(() => {
DoThisFunction3();
}, TaskCreationOptions.LongRunning);
}
有人能给出一个简单的方法吗?
答案 0 :(得分:5)
您可以使用没有返回类型的WaitAll
,并在任务上阻止与Wait
相似,或WhenAll
将返回等待Task
。
示例:
var tasks = new Task[] {
Task.Factory.StartNew(() => {
DoThisFunction1();
}, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => {
DoThisFunction2();
}, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => {
DoThisFunction3();
}, TaskCreationOptions.LongRunning)
};
Task.WaitAll(tasks);
// or
await Task.WhenAll(tasks);
可以找到更详细的答案here
答案 1 :(得分:2)
class TasksTest
{
public void Test()
{
List<string> sets = new List<string>
{
"set1", "set2", "set3", "set4",
};
foreach (var s in sets)
{
Console.WriteLine("Set {0}", s);
var tasks = new[]
{
Task.Factory.StartNew(() => {DoThisFunction1();}, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => { DoThisFunction2(); }, TaskCreationOptions.LongRunning),
Task.Factory.StartNew(() => { DoThisFunction3(); }, TaskCreationOptions.LongRunning),
};
Task.WaitAll(tasks);
Console.WriteLine("End Set {0}\n------------", s);
}
}
void DoThisFunction1()
{
Thread.Sleep(1000);
Console.WriteLine("F1");
}
void DoThisFunction2()
{
Thread.Sleep(1500);
Console.WriteLine("F2");
}
void DoThisFunction3()
{
Thread.Sleep(2000);
Console.WriteLine("F3");
}
}