服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 多线程处理List数据的示例代码

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

2022-10-24 11:43傅小灰 C#

这篇文章主要介绍了C# 多线程处理List数据的示例代码,帮助大家更好的理解和使用c#编程语言,感兴趣的朋友可以了解下

代码思路

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

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

直接上代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/// <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);
  }
}
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/// <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;
}

调用方法

?
1
2
3
4
5
6
7
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数据的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/cplemom/p/11923115.html

延伸 · 阅读

精彩推荐
  • C#C#实现简单记事本程序

    C#实现简单记事本程序

    这篇文章主要为大家详细介绍了C#实现简单记事本程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    Hades_Dev5982022-07-16
  • C#UGUI实现图片拖拽功能

    UGUI实现图片拖拽功能

    这篇文章主要为大家详细介绍了UGUI实现图片拖拽功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    u01423092310432022-03-11
  • C#详解C#设置Excel数据自适应行高、列宽的2种情况

    详解C#设置Excel数据自适应行高、列宽的2种情况

    这篇文章主要介绍了C#设置Excel数据自适应行高、列宽的2种情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需...

    E-iceblue7062022-07-20
  • C#C#文件上传与下载的实现方法

    C#文件上传与下载的实现方法

    这篇文章主要为大家详细介绍了C#文件上传与下载的实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    小倔驴4782022-01-20
  • C#c# 实现轮询算法实例代码

    c# 实现轮询算法实例代码

    这篇文章主要介绍了c# 实现轮询算法实例代码的相关资料,这里附有实例代码,具有一定的参考价值,需要的朋友可以参考下...

    pengpeng8042021-12-11
  • C#C#验证码的创建与使用示例

    C#验证码的创建与使用示例

    这篇文章主要介绍了C#验证码的创建与使用方法,结合实例形式较为详细的分析了C#验证码的创建、验证等操作步骤与相关技巧,需要的朋友可以参考下...

    pan_junbiao4842021-12-22
  • C#C#中的那些常用加密算法

    C#中的那些常用加密算法

    本文主要讲解一下C#常用的那些加密算法,包括MD5加密、SHA1加密、Base64加密、Des加密、RSA加密等,需要的朋友可以参考下...

    kiba5185652022-10-18
  • C#unity实现屏幕上写字效果

    unity实现屏幕上写字效果

    这篇文章主要为大家详细介绍了unity实现屏幕上写字效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    人生若只如初见~~9452022-07-29