欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C# 多線程處理List數(shù)據(jù)的示例代碼

 更新時(shí)間:2020年12月14日 08:53:15   作者:傅小灰  
這篇文章主要介紹了C# 多線程處理List數(shù)據(jù)的示例代碼,幫助大家更好的理解和使用c#編程語言,感興趣的朋友可以了解下

代碼思路

將要處理的數(shù)據(jù)放到ConcurrentQueue中,然后開啟多個(gè)線程去處理數(shù)據(jù),處理完成后,再到隊(duì)列中獲取下一個(gè)待處理數(shù)據(jù)。

ConcurrentQueue 表示線程安全的先進(jìn)先出 (FIFO) 集合,屬于 System.Collections.Concurrent 命名空間下的一個(gè)數(shù)據(jù)結(jié)構(gòu)

直接上代碼

/// <summary>
/// 多線程處理數(shù)據(jù)(無返回值)
/// </summary>
/// <typeparam name="T">數(shù)據(jù)類型</typeparam>
/// <param name="list">待處理數(shù)據(jù)</param>
/// <param name="action">數(shù)據(jù)處理方法(有參數(shù)無返回值)</param>
/// <param name="count">處理線程數(shù)量</param>
/// <param name="waitFlag">是否等待執(zhí)行結(jié)束</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>
/// 多線程處理數(shù)據(jù)(返回處理后列表)
/// </summary>
/// <typeparam name="T">數(shù)據(jù)類型</typeparam>
/// <param name="list">待處理數(shù)據(jù)</param>
/// <param name="func">數(shù)據(jù)處理方法(有參數(shù)有返回值)</param>
/// <param name="threadCount">處理線程數(shù)量</param>
/// <returns>數(shù)據(jù)處理后結(jié)果</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;
}

調(diào)用方法

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

//對列表中數(shù)據(jù)都執(zhí)行 “*2” 的操作
var result = RunTask<int>(list, d => { return d * 2; });
result.ForEach(d => Console.WriteLine(d));

最后的話

上面的代碼只是簡單的實(shí)現(xiàn)了對數(shù)據(jù)的處理,并沒有考慮到對內(nèi)存的使用限制,一般的項(xiàng)目中使用還是可以的。
最后我嘗試了下,生成一個(gè)100M的列表,然后將其加載到ConcurrentQueue,監(jiān)控程序內(nèi)存占用,發(fā)現(xiàn)沒有很大的內(nèi)存占用變化。

以上就是C# 多線程處理List數(shù)據(jù)的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于c# 處理list數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#實(shí)現(xiàn)餐廳管理系統(tǒng)

    C#實(shí)現(xiàn)餐廳管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)餐廳管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 淺談C#網(wǎng)絡(luò)編程詳解篇

    淺談C#網(wǎng)絡(luò)編程詳解篇

    在現(xiàn)今軟件開發(fā)中,網(wǎng)絡(luò)編程是非常重要的一部分,本文簡要介紹下網(wǎng)絡(luò)編程的概念和實(shí)踐,需要的朋友可以參考下
    2017-01-01
  • C#基礎(chǔ)之泛型

    C#基礎(chǔ)之泛型

    泛型是 2.0 版 C# 語言和公共語言運(yùn)行庫 (CLR) 中的一個(gè)新功能。接下來通過本文給大家介紹c#基礎(chǔ)之泛型,感興趣的朋友一起學(xué)習(xí)吧
    2016-08-08
  • C#使用自定義的泛型節(jié)點(diǎn)類實(shí)現(xiàn)二叉樹類

    C#使用自定義的泛型節(jié)點(diǎn)類實(shí)現(xiàn)二叉樹類

    這篇文章主要為大家詳細(xì)介紹了C#如何使用自定義的泛型節(jié)點(diǎn)類 Node<T>實(shí)現(xiàn)二叉樹類BinaryTree<T>及其方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C#統(tǒng)計(jì)C、C++及C#程序代碼行數(shù)的方法

    C#統(tǒng)計(jì)C、C++及C#程序代碼行數(shù)的方法

    這篇文章主要介紹了C#統(tǒng)計(jì)C、C++及C#程序代碼行數(shù)的方法,較為詳細(xì)的分析了C#統(tǒng)計(jì)文本文件的原理與相關(guān)實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • c#中的擴(kuò)展方法學(xué)習(xí)筆記

    c#中的擴(kuò)展方法學(xué)習(xí)筆記

    擴(kuò)展方法能夠向現(xiàn)有類型“添加”方法,而無需創(chuàng)建新的派生類型,重新編譯或以其他方式修改原始類型。下面這篇文章主要給大家介紹了關(guān)于c#中擴(kuò)展方法學(xué)習(xí)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-11-11
  • C#實(shí)現(xiàn)winform漸變效果的方法

    C#實(shí)現(xiàn)winform漸變效果的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)winform漸變效果的方法,涉及到窗體的設(shè)計(jì)與屬性的修改等技巧,需要的朋友可以參考下
    2014-10-10
  • C#實(shí)現(xiàn)DataTable映射成Model的方法(附源碼)

    C#實(shí)現(xiàn)DataTable映射成Model的方法(附源碼)

    這篇文章主要介紹了C#實(shí)現(xiàn)DataTable映射成Model的方法,以實(shí)例形式較為詳細(xì)的分析了DataTable映射成Model的具體步驟與相關(guān)技巧,并附帶了完整實(shí)例源碼供讀者下載,需要的朋友可以參考下
    2015-11-11
  • C#中List用法介紹詳解

    C#中List用法介紹詳解

    本文詳細(xì)講解了C#中List用法介紹,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • 詳解C#枚舉中使用Flags特性

    詳解C#枚舉中使用Flags特性

    這篇文章主要介紹了C#枚舉中使用Flags特性的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評論