我有几个按顺序运行的任务;一个接一个地。
Task.Factory.StartNew(() => DoWork1())
.ContinueWith((t1) => DoWork2())
.ContinueWith(t2 => DoWork3());
我想把它放在一个循环中,所以它们无限期地运行(在DoWork3()
完成之后,回到DoWork1()
。我尝试放入一个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();
}
}
您可以在开始下一次while循环迭代之前等待任务完成。
while(true)
{
var task = Task.Factory.StartNew(() => DoWork1())
.ContinueWith((t1) => DoWork2())
.ContinueWith(t2 => DoWork3());
task.Wait();
}
如果没有task.Wait()
(或类似的机制),任务将被安排运行,但是while循环的下一次迭代将开始,而不必等待这些任务完成。
您可以执行以下操作:
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());