C# Task 使用 WhenAll 和 WaitAll 需要注意的坑
1.无限等待#
我们在使用 WhenAll 和 WaitAll 时,一定得要注意:1.必须添加超时时间,防止无限等待 2.等待的 Task 一定要保证是启动的。
比如下面这种写法:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace TaskForWhenAll
{
class Program
{
static void Main(string[] args)
{
var taskList = new List<Task>();
for (int i = 0; i < 5; i++)
{
taskList.Add(new Task(() =>
{
Console.WriteLine("Task {0} is finished", Task.CurrentId);
}));
}
// await Task.WhenAny(taskList);
Task.WaitAll(taskList.ToArray());
Console.WriteLine("exit");
}
}
}
将不会正常运行,会一直无限等待,因为 new Task 这样创建出来的 Task 不会自动运行,需要手动调用 Task.Start
改造一下代码:
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace TaskForWhenAll
{
class Program
{
static void Main(string[] args)
{
var taskList = new List<Task>();
for (int i = 0; i < 5; i++)
{
taskList.Add(Task.Run(() =>
{
Console.WriteLine("Task {0} is finished", Task.CurrentId);
}));
}
// await Task.WhenAny(taskList);
Task.WaitAll(taskList.ToArray());
Console.WriteLine("exit");
}
}
}
使用 Task.Run 创建的 Task 是会自动运行的
2.没有期望的等待#
我们在创建 Task 时,可能会定义一个异步委托,以便方便在 Task 里面使用 await,例如:
class Program
{
static async Task Main(string[] args)
{
var taskList = new List<Task>();
for (int i = 0; i < 5; i++)
{
taskList.Add(Task.Factory.StartNew(async () =>
{
await Task.Delay(3000);
Console.WriteLine("Task {0} is finished", Task.CurrentId);
}));
}
await Task.WhenAny(taskList);
Console.WriteLine("exit");
}
}
直接运行会发生什么
直接就退出了,并没有等待所有任务执行完毕。
我们换成 Task.Run 是可以正常运行的,这是为什么呢?这是因为我们这种写法,会把 Task Result 包装一层,我们需要得到期望的结果需要解除包装 UnWrap,Task.Factory.StartNew和Task.Run区别之一就有Task.Run会自动执行Unwrap操作。
扩展阅读:https://www.cnblogs.com/Leo_wl/archive/2012/09/21/2696342.html
我们改造一下代码
taskList.Add(Task.Factory.StartNew(async () =>
{
await Task.Delay(3000);
Console.WriteLine("Task {0} is finished", Task.CurrentId);
}).Unwrap());
就能按照我们期望的去运行
作者:晓晨Master(李志强)
出处:https://www.cnblogs.com/stulzq/p/16067610.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
目前学习.NET Core 最好的教程 .NET Core 官方教程 ASP.NET Core 官方教程
分类:
.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix