gpt4 book ai didi

c# - 在 C# 中,如何让一组任务完成后运行一个任务?

转载 作者:行者123 更新时间:2023-12-02 02:19:22 25 4
gpt4 key购买 nike

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

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 个任务的顺序并不重要,重要的是最后任务最后完成。我无法阻止线程或等待集合完成以及类似的事情,只有最后任务必须在前三个任务完成后执行。

最佳答案

任务是“热”创建的,即已经在进行中。如果要延迟任务的启动,请使用委托(delegate) ( 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();
}

附注Don't use ContinueWith .

关于c# - 在 C# 中,如何让一组任务完成后运行一个任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66661312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com