Parallel.For实现


static class MyParallel
{

    //4.0及以上用Task, Task的背后的实现也是使用了线程池线程
    //static List tasks = new List();

    //4.0以下用Thread
    static List tasks = new List();

    //队列
    static Queue<int[]> datas = new Queue<int[]>();
public static void For(int start, int end, Action<int> action) { //逻辑处理器数量 var taskAllCount = Environment.ProcessorCount*2; #region 每次处理的量 int pageSize = end / taskAllCount; if (pageSize == 0) { pageSize = 1; } #endregion #region 分配处理范围 var totalCount = end; for (int pageIndex = 0; totalCount >= 0; pageIndex++) { int pageStart = pageIndex * pageSize; int pageEnd = pageIndex * pageSize + pageSize; datas.Enqueue(new int[] { pageStart, pageEnd }); //入队 totalCount -= pageSize; } #endregion #region 根据逻辑处理器数量创建任务,并启动 int i = 0; while (tasks.Count < taskAllCount) { tasks.Add(new Thread(() => { while (datas.Count > 0) { var one = new int[] { end, end }; lock (datas) { one = datas.Dequeue(); } for (int j = one.First(); j < end && j < one.Last(); j++) { action(j); } System.Threading.Thread.Sleep(10); } })); tasks[i].IsBackground = true; tasks[i].Start(); i++; } #endregion //等待所有任务结束 foreach (var task in tasks) { task.Join(); task.Abort(); } tasks.Clear(); //Task.WaitAll(tasks.ToArray()); } }