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

  • 相关阅读:
    thymeleaf的基本用法
    IK配置远程自定义词典热更新词库
    mysql卸载及安装及修改用户密码登录问题处理win10系统
    js获取table元素中的tr及td的值
    java中日期与字符串的转换
    layui使用动态渲染表单数据
    Tomcat 80端口被占用
    windows和Linux下定时启动或关闭服务
    【UE】常用的UltraEdit使用技巧
    Oracle查询显示CLOB的内容
  • 原文地址:https://www.cnblogs.com/csj007523/p/15037685.html
Copyright © 2020-2023  润新知