多线程,控制Task的20个并发数量,全部子线程执行完后,获取所有返回的值
//控制下Task的20个并发数量,
List<Task> taskList = new List<Task>();
for (int i = 0; i < 10000; i++)
{
int k = i;
if (taskList.Count(t => t.Status != TaskStatus.RanToCompletion) >= 20)
{
Task.WaitAny(taskList.ToArray());
taskList = taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
}
taskList.Add(Task.Run(() =>
{
Console.WriteLine($"This is {k} running ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
Thread.Sleep(2000);
}));
}
//taskList 全部子线程执行完后,获取所有返回的值
for(int i=0;i<taskList .count();i++)
{
var result= taskList[i].result;
}
------demo-------
//循环List,启用20个线程去执行计算每个item的销售价格,全部销售价格计算完成,返回销售价格;
public static void Show()
{
List<Task> taskList = new List<Task>();
int skuList = 10000;
for (int i = 0; i < skuList; i++)
{
try
{
int k = i;
if (taskList.Count(t => t.Status != TaskStatus.RanToCompletion) >= 20)
{
Task.WaitAny(taskList.ToArray());
taskList = taskList.Where(t => t.Status != TaskStatus.RanToCompletion).ToList();
}
taskList.Add(Task.Run(() =>
{
var result = GetCalculator(k, Thread.CurrentThread.ManagedThreadId.ToString());
}));
}
catch(Exception ex)
{
//throw ex
}
}
Task.WaitAll(taskList.ToArray());
//taskList 全部子线程执行完后,获取所有list返回的值
for (int i = 0; i < list.Count(); i++)
{
var result = list[i];
}
}
public static List<string> GetCalculator(int i,string id)
{
lock (Lock)
{
list.Add(i.ToString() + "_Thread_" + id);
}
return list;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2012-07-21 Objective-C 关键字 学好必知
2012-07-21 IOS NSOperation的使用方法
2012-07-21 IOS 实现本地通知(local notification)的yong法
2010-07-21 人脉关系大检阅 chuangye