我有几个按顺序运行的任务;一个接一个。
Task.Factory.StartNew(() => DoWork1())
.ContinueWith((t1) => DoWork2())
.ContinueWith(t2 => DoWork3());
我想把它放在一个循环中,所以它们无限期地运行(DoWork3()
完成之后,回到DoWork1()
。我尝试放入一个while循环,但是循环进入下一个迭代一旦任务启动,就会产生大量的新任务。
还有一种方法可以退出条件以摆脱循环,也许会传递取消令牌。
谢谢!
答案 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());