C# 多線程處理List數(shù)據(jù)的示例代碼
代碼思路
將要處理的數(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#使用自定義的泛型節(jié)點(diǎn)類實(shí)現(xiàn)二叉樹類
這篇文章主要為大家詳細(xì)介紹了C#如何使用自定義的泛型節(jié)點(diǎn)類 Node<T>實(shí)現(xiàn)二叉樹類BinaryTree<T>及其方法,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-03-03C#統(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-08C#實(shí)現(xiàn)DataTable映射成Model的方法(附源碼)
這篇文章主要介紹了C#實(shí)現(xiàn)DataTable映射成Model的方法,以實(shí)例形式較為詳細(xì)的分析了DataTable映射成Model的具體步驟與相關(guān)技巧,并附帶了完整實(shí)例源碼供讀者下載,需要的朋友可以參考下2015-11-11