多线程读取list或ConcurrentQueue工具类

public static class TaskHelper
{
        /// 
        /// 多线程处理list数据(无返回值)
        /// 
        /// 
        /// 待处理列表
        /// 处理操作/方法
        /// 线程数量(默认为5)
        /// 是否等待所有线程执行结束(默认true)
        public static void RunTask(this List list, Action action, int threadCount = 5, bool waitFlag = true)
        {
            ConcurrentQueue queue = new ConcurrentQueue(list);
            RunTask(queue, action, threadCount, waitFlag);
        }
        /// 
        /// 多线程处理线程安全队列数据
        /// 
        /// 
        /// 待处理队列
        /// 处理操作/方法
        /// 线程数量(默认为5)
        /// 是否等待所有线程执行结束(默认true)
        public static void RunTask(this ConcurrentQueue queue, Action action, int threadCount = 5, bool waitFlag = true)
        {
            Task[] tasks = new Task[threadCount];
            for (var i = 0; i < threadCount; i++)
            {
                tasks[i] = Task.Run(() =>
                {
                    while (queue.TryDequeue(out T t))
                        action(t);
                });
            }

            if (waitFlag)
            {
                Task.WaitAll(tasks);
            }
        }
        /// 
        /// 多线程处理list数据(有返回值)
        /// 
        /// 待处理数据类型
        /// 返回数据类型
        /// 待处理列表
        /// 处理操作/方法
        /// 线程数量(默认为5)
        /// 
        public static List RunTask(this List list, Func func, int threadCount = 5)
        {
            ConcurrentQueue queue = new ConcurrentQueue(list);
            return RunTask(queue, func, threadCount);
        }
        /// 
        /// 多线程处理list数据(有返回值)
        /// 
        /// 待处理数据类型
        /// 返回数据类型
        /// 待处理队列
        /// 处理操作/方法
        /// 线程数量(默认为5)
        /// 
        public static List RunTask(this ConcurrentQueue queue, Func func, int threadCount = 5)
        {
            List result = new List();
            Task>[] tasks = new Task>[threadCount];
            for (var i = 0; i < threadCount; i++)
            {
                tasks[i] = Task.Run(() =>
                {
                    var rList = new List();
                    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数据(有返回值)
        /// 
        /// 待处理数据类型
        /// 返回数据类型
        /// 待处理列表
        /// 处理操作/方法
        /// 线程数量(默认为5)
        /// 
        public static List RunTask(this List list, Func> func, int threadCount = 5)
        {
            ConcurrentQueue queue = new ConcurrentQueue(list);
            return RunTask(queue, func, threadCount);
        }
        /// 
        /// 多线程处理list数据(有返回值)
        /// 
        /// 待处理数据类型
        /// 返回数据类型
        /// 待处理队列
        /// 处理操作/方法
        /// 线程数量(默认为5)
        /// 
        public static List RunTask(this ConcurrentQueue queue, Func> func, int threadCount = 5)
        {
            List result = new List();
            Task>[] tasks = new Task>[threadCount];
            for (var i = 0; i < threadCount; i++)
            {
                tasks[i] = Task.Run(() =>
                {
                    var rList = new List();
                    while (queue.TryDequeue(out T t))
                        rList.AddRange(func(t));

                    return rList;
                });
            }
            Task.WaitAll(tasks);

            for (int i = 0; i < threadCount; i++)
            {
                result.AddRange(tasks[i].Result);
            }

            return result;
        }
}

你可能感兴趣的:(c#)