在无限循环内按顺序运行任务[关闭]

问题描述 投票:1回答:3

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

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

我想把它放在一个循环中,所以它们无限期地运行(在DoWork3()完成之后,回到DoWork1()。我尝试放入一个while循环,但是循环在任务启动后立即进入下一次迭代,创建了一大堆新任务。

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

谢谢!

c# multithreading task task-parallel-library
3个回答
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
投票

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

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

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


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());
© www.soinside.com 2019 - 2024. All rights reserved.