多线程,控制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;
}

posted @   大树2  阅读(424)  评论(0编辑  收藏  举报
编辑推荐:
· 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
点击右上角即可分享
微信分享提示