c# - 如何在 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任务最后完成。我不能阻塞线程或等待收集完成和类似的东西,只有最后一个任务必须在前三个完成后执行。
解决方案
任务是“热”创建的,即已经在进行中。如果您想延迟任务的开始,请使用委托 ( 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();
}
推荐阅读
- jquery - 如何在 ASP.NET MVC 5 项目中使用 jquery-validation-unobtrusive 验证文件的大小?
- c# - 如何使用 AuthenticationMiddleware 和注入应用程序设置
- ios - 在自定义迁移策略中传递给模型迁移函数时,Core Data 实体中的 Int16 支持的枚举属性似乎具有不正确的值
- ethereum - 以太坊 Geth - 待处理交易
- android - 自定义 TextInputLayout 和 TextInputEditText
- python - Numpy 滚动 Columwise 相关性
- sql - SQL选择小于特定日期的最大日期
- python - sklearn.Normalization 是否有可用的 invert_transform 方法
- html - 用于更改图像的媒体查询
- hibernate - 不获取在休眠中插入的最近记录