如何在C#中完成一组任务后运行一个任务



我有一组任务,必须在运行最后一个任务之前完成。具体而言:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var task1 = Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("Task1");
});
var task2 = Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("Task2");
});
var task3 = Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("Task2");
});
var last = Task.Run(() =>
{
Console.WriteLine("Last");
});
var tasks = new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);
await Task.WhenAll(tasks).ContinueWith(t => last);
}

目前他们是这样完成的:

Last
Task2
Task3
Last1

我希望他们这样完成:

Task1
Task2
Task3
Last

前3个的顺序无关紧要,重要的是Last任务最后完成。我不能阻塞线程或等待集合完成以及类似的事情,只有Last任务必须在前三个任务完成后执行。

创建任务"热";,即已经在进行中。如果要延迟任务的启动,请使用委托(Func<Task>(或单独的async方法。

我喜欢这种行为的本地async方法:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
async Task Task1() => Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("Task1");
});
async Task Task2() => Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("Task2");
});
async Task Task3() => Task.Run(() =>
{
Thread.Sleep(5000);
Console.WriteLine("Task2");
});
async Task Last() => Task.Run(() =>
{
Console.WriteLine("Last");
});
var tasks = new List<Task>();
tasks.Add(Task1());
tasks.Add(Task2());
tasks.Add(Task3());
await Task.WhenAll(tasks);
await Last();
}

附言:不要使用ContinueWith

//var last = Task.Run(() =>
//{
//    Console.WriteLine("Last");
//});
var tasks = new List<Task>();
tasks.Add(task1);
tasks.Add(task2);
tasks.Add(task3);
await Task.WhenAll(tasks);  //.ContinueWith(t => last);
Task.Run(() =>
{
Console.WriteLine("Last");
});

最新更新