当前位置: 首页 > news >正文

使用多线程处理List数据

最近遇到了一个业务场景,需要对List中的数据逐个发起http请求(List中的数据各自独立,对执行顺序无要求),考虑到可以使用多线程加快处理速度。

封装了如下方法:

/// <summary>/// 多线程处理数据-无返回值/// </summary>/// <param name="list"></param>/// <param name="action">数据处理方法</param>/// <param name="threadCount">开启线程数量</param>/// <param name="waitFlag">是否等待全部结束</param>static void RunTask<T>(List<T> list, Action<T> action, int threadCount = 5, bool waitFlag = true){var queue = new ConcurrentQueue<T>(list);threadCount = Math.Min(threadCount, list.Count);Task[] tasks = new Task[threadCount];for (int i = 0; i < threadCount; i++){tasks[i] = Task.Run(() =>{while (queue.TryDequeue(out T t)){action(t);}});}if (waitFlag){Task.WaitAll(tasks);}}/// <summary>/// 多线程处理数据-有返回值/// </summary>/// <param name="list">待处理数据</param>/// <param name="func">数据处理方法</param>/// <param name="count">开启线程数量</param>static List<TReturn> RunTask<T, TReturn>(List<T> list, Func<T, TReturn> func, int threadCount = 5){var result = new ConcurrentBag<TReturn>();var queue = new ConcurrentQueue<T>(list);threadCount = Math.Min(threadCount, list.Count);var tasks = new Task[threadCount];for (int i = 0; i < threadCount; i++){tasks[i] = Task.Run(() =>{while (queue.TryDequeue(out T t)){result.Add(func(t));}});}Task.WaitAll(tasks);return result.ToList();}

使用示例:

public void DoSingle(User user, string param1, string param2){//HttpHelper.Get("http://xxxx/userid="+user.id);//doSomething();Console.WriteLine(user.Id + "-" + user.Name + "-" + param1 + "-" + param2);}public string DoSingle2(User user, string param1, string param2){//HttpHelper.Get("http://xxxx/userid="+user.id);//doSomething();Console.WriteLine(user.Id + "-" + user.Name + "-" + param1 + "-" + param2);return user.Id + "-666";}public class User{/// <summary>/// id/// </summary>public int Id { get; set; }/// <summary>/// 姓名/// </summary>public string Name { get; set; }}public void Test(){var list = new List<User> {new User { Id = 1, Name = "张三" },new User { Id = 2, Name = "李四" },new User { Id = 3, Name = "王五" }};RunTask(list, t => DoSingle(t, "参数1", "参数2"));var retList = RunTask(list, t => DoSingle2(t, "参数1", "参数2"));}

http://www.lryc.cn/news/227888.html

相关文章:

  • Elasticsearch--Python使用、Django/Flask集成
  • pyspark将数据多次插入表的时候报错
  • Qt绘制饼状图
  • Vue3 setup函数
  • Django(三、数据的增删改查、Django生命周期流程图)
  • Linux 部署Sentinel控制台
  • 服务器如何下载百度网盘数据
  • POJ 3254 Corn Fields 状态压缩DP(铺砖问题)
  • transformers安装避坑
  • 牛客、赛码网OJ调试(全)
  • 【CSS】全局声明引入自定义字体
  • 「Flask」路由+视图函数
  • 信息系统项目管理师 教材目录、考试大纲、考情
  • python线性回归实现
  • 【JavaEESpring】认识Spring
  • Rust逆向学习 (5)
  • 89.STL-函数对象的使用(仿函数)
  • 文件管理技巧:按文件容量大小分类,自动移动至目标文件夹的方法
  • [架构之路-246]:目标系统 - 设计方法 - 软件工程 - 需求工程- 需求开发:获取、分析、定义、验证
  • 轻量日志管理方案-[EFK]
  • Halcon WPF 开发学习笔记:HSmartWindowControlWPF正常加载
  • mybatis的简单教程
  • 数据结构 队列(C语言实现)
  • Android---屏幕适配的处理技巧
  • vmware workstation 与 device/credential guard 不兼容
  • 第7章-使用统计方法进行变量有效性测试-7.2.1-单因素方差分析
  • 黑客技术-小白学习手册
  • 用示波器测量高压电
  • AQS中Node状态
  • STM32 寄存器配置笔记——GPIO配置输出