运行 个任务在无限循环中按顺序执行

Running tasks in sequence inside an infinite loop

我有几项任务是 运行 的顺序;一个接一个。

Task.Factory.StartNew(() => DoWork1())
            .ContinueWith((t1) => DoWork2())
            .ContinueWith(t2 => DoWork3());

我想把它放在一个循环中,这样他们 运行 无限期地(在 DoWork3() 完成后,回到 DoWork1()。我试着把它放在一个 while 循环中,但是一旦任务启动,循环就会进入下一次迭代,从而创建大量新任务。

最好有一种退出条件的方法来跳出循环,也许可以传递一个取消标记。

谢谢!

您可以等待任务完成,然后再开始 while 循环的下一次迭代。

while(true) 
{
    var task = Task.Factory.StartNew(() => DoWork1())
            .ContinueWith((t1) => DoWork2())
            .ContinueWith(t2 => DoWork3());
    task.Wait(); 
}   

如果没有 task.Wait()(或类似机制),任务将被安排到 运行,但 while 循环的下一次迭代将开始而不等待这些任务完成。

最简单的方法是使用 async/await:

async void DoStuff()
{
    while (true)
    {
        await Task.Factory.StartNew(() => DoWork1())
            .ContinueWith((t1) => DoWork2())
            .ContinueWith(t2 => DoWork3());
    }
}

或者你可以在最后一个任务完成后再次调用该方法,模拟一个while(true)

void DoStuff()
{
    Task.Factory.StartNew(() => DoWork1())
        .ContinueWith((t1) => DoWork2())
        .ContinueWith(t2 => DoWork3())
        .ContinueWith(t3=> DoStuff());
}

您也可以 Wait 显式执行该任务,但这会阻塞您正在执行的线程:

void DoStuff()
{
    while (true)
    {
        Task.Factory.StartNew(() => DoWork1())
            .ContinueWith((t1) => DoWork2())
            .ContinueWith(t2 => DoWork3())
            .Wait();
    }
}

您可以进行如下操作:

List<Task> tasks = new List<Task>();

for (int i = 0; i < 10; i++) //your loop
{
    var task = Task.Factory.StartNew(() => DoWork1()).ContinueWith((t1) => DoWork2()).ContinueWith(t2 => DoWork3());
    tasks.Add(task);
}

Task.WaitAll(tasks.ToArray());