运行 个任务在无限循环中按顺序执行
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());
我有几项任务是 运行 的顺序;一个接一个。
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());