C# 多线程处理List数据的示例代码

 更新时间:2020年12月14日 08:53:15   作者:傅小灰  
这篇文章主要介绍了C# 多线程处理List数据的示例代码,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下

代码思路

将要处理的数据放到ConcurrentQueue中,然后开启多个线程去处理数据,处理完成后,再到队列中获取下一个待处理数据。

ConcurrentQueue 表示线程安全的先进先出 (FIFO) 集合,属于 System.Collections.Concurrent 命名空间下的一个数据结构

直接上代码

/// <summary>
/// 多线程处理数据(无返回值)
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="list">待处理数据</param>
/// <param name="action">数据处理方法(有参数无返回值)</param>
/// <param name="count">处理线程数量</param>
/// <param name="waitFlag">是否等待执行结束</param>
static void RunTask<T>(List<T> list, Action<T> action, int threadCount = 5, bool waitFlag = true)
{
  ConcurrentQueue<T> queue = new ConcurrentQueue<T>(list);
  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>
/// <typeparam name="T">数据类型</typeparam>
/// <param name="list">待处理数据</param>
/// <param name="func">数据处理方法(有参数有返回值)</param>
/// <param name="threadCount">处理线程数量</param>
/// <returns>数据处理后结果</returns>
static List<T> RunTask<T>(List<T> list, Func<T, T> func, int threadCount = 5)
{
  var result = new List<T>();
  ConcurrentQueue<T> queue = new ConcurrentQueue<T>(list);
  Task<List<T>>[] tasks = new Task<List<T>>[threadCount];
  for (int i = 0; i < threadCount; i++)
  {
    tasks[i] = Task.Run<List<T>>(() =>
    {
      var rList = new List<T>();
      while (queue.TryDequeue(out T t))
      {
        rList.Add(func(t));
      }
      return rList;
    });
  }
  Task.WaitAll(tasks);
  for (int i = 0; i < threadCount; i++)
  {
    result.AddRange(tasks[i].Result);
  }
  return result;
}

调用方法

List<int> list = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//输出列表中的数据,且加上“action”字符前缀
RunTask<int>(list, d => { Console.WriteLine("action" + d); });

//对列表中数据都执行 “*2” 的操作
var result = RunTask<int>(list, d => { return d * 2; });
result.ForEach(d => Console.WriteLine(d));

最后的话

上面的代码只是简单的实现了对数据的处理,并没有考虑到对内存的使用限制,一般的项目中使用还是可以的。
最后我尝试了下,生成一个100M的列表,然后将其加载到ConcurrentQueue,监控程序内存占用,发现没有很大的内存占用变化。

以上就是C# 多线程处理List数据的示例代码的详细内容,更多关于c# 处理list数据的资料请关注脚本之家其它相关文章!

相关文章

  • c# 托盘双击不触发单击事件的实现方法

    c# 托盘双击不触发单击事件的实现方法

    在开发winform的时候我发现,当执行双击操作(notifyIcon1_MouseDoubleClick)时,会同时伴随着单击事件(notifyIcon1_MouseClick)的发生。。那如何才能使双击事件不触发单击事件呢?
    2009-02-02
  • C#微信开发之自定义菜单管理

    C#微信开发之自定义菜单管理

    本文主要介绍了C#微信开发中自定义菜单管理的相关知识,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • C#微信公众号开发之接收事件推送与消息排重的方法

    C#微信公众号开发之接收事件推送与消息排重的方法

    这篇文章主要介绍了C#微信公众号开发之接收事件推送与消息排重的方法,详细分析了事件推送与消息排重的使用技巧,对微信开发有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • Unity UGUI的LayoutElement布局元素组件介绍使用示例

    Unity UGUI的LayoutElement布局元素组件介绍使用示例

    这篇文章主要为大家介绍了Unity UGUI的LayoutElement布局元素组件介绍使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • C#中同步和异步回调的实现

    C#中同步和异步回调的实现

    在C#中,同步回调和异步回调都是用于处理任务或事件完成的机制,本文主要介绍了C#中同步和异步回调的实现,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • 基于WPF实现3D导航栏控件

    基于WPF实现3D导航栏控件

    这篇文章主要介绍了如何基于WPF实现简单的3D导航栏控件效果,文中的示例代码讲解详细,对我们的学习或工作有一定帮助,需要的小伙伴可以参考一下
    2024-03-03
  • C#和Java互相调用的方法小结

    C#和Java互相调用的方法小结

    这篇文章主要介绍了C#和Java互相调用的方法,文中展示了如何在不同编程语言之间实现互操作,每种语言之间的互操作都有其特定的方法和工具,希望这些示例能够帮助你更好地理解和实现跨语言调用,需要的朋友可以参考下
    2025-04-04
  • C#实现给图片添加日期信息的示例详解

    C#实现给图片添加日期信息的示例详解

    这篇文章主要为大家详细介绍了如何利用C#实现给图片添加日期信息,文中的示例代码讲解详细,对我们学习C#有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • C#使用融合通信API发送手机短信功能

    C#使用融合通信API发送手机短信功能

    融合云通信服务平台,为企业提供全方位通信服务,发送手机短信是其一项核心功能,本文介绍了如何使用融合云通信服务平台的API通过C#实现发送手机短信的功能,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • C#与java TCP通道加密通信实例

    C#与java TCP通道加密通信实例

    这篇文章主要介绍了C#与java TCP通道加密通信,文章通过真实的案例详细讲解说明C#与java TCP通道加密通信的相关资料,需要的小伙伴可以参考一下
    2021-10-10

最新评论