在无限循环内按顺序运行任务

时间:2018-03-01 05:24:17

标签: c# multithreading task task-parallel-library

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

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

我想把它放在一个循环中,所以它们无限期地运行(DoWork3()完成之后,回到DoWork1()。我尝试放入一个while循环,但是循环进入下一个迭代一旦任务启动,就会产生大量的新任务。

还有一种方法可以退出条件以摆脱循环,也许会传递取消令牌。

谢谢!

3 个答案:

答案 0 :(得分:3)

最简单的方法是使用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();
    }
}

答案 1 :(得分:1)

您可以在开始下一次while循环迭代之前等待任务完成。

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

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

答案 2 :(得分:0)

您可以执行以下操作:

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());