static class MyParallel
{ //4.0及以上用Task, Task的背后的实现也是使用了线程池线程
//static List<Task> tasks = new List<Task>(); //4.0以下用Thread
static List<Thread> tasks = new List<Thread>(); //队列
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());
}
}

性能测试

            var list = new List<int>(1000);
for (int i = 0; i < 1000; i++)
{
list.Add(i);
}
string startTime = DateTime.Now.ToString(); int ii = 0;
MyParallel.For(0, list.Count, x =>
{
Thread.Sleep(10);
Console.WriteLine($"{x.ToString()},{ Interlocked.Increment(ref ii)}");
});
Console.WriteLine("Parallel.For " + startTime + "," + DateTime.Now); Console.ReadKey();
startTime = DateTime.Now.ToString();
foreach (var item in list)
{
Thread.Sleep(10);
Console.WriteLine(item.ToString());
}
Console.WriteLine("for" + startTime + "," + DateTime.Now); Console.ReadKey();

最新文章

  1. css实现容器垂直水平居中的七中方法
  2. Windows Phone 二、WP控件
  3. IOS UIButton用法详解
  4. MSI Error 1603 installing AppFabric 1.1 / Win7 x64
  5. 2015最新百度搜索引擎(seo优化)排名算法
  6. 51Nod 算法马拉松15 记一次悲壮而又开心的骗分比赛
  7. centos复制到另外一台电脑连不上网
  8. 常用js函数
  9. vs2012 .net4.0 nuget 导入NHibernate4.0版本
  10. 一步一步带你实现virtual dom(一)
  11. BZOJ_1180_[CROATIAN2009]OTOCI_LCT
  12. github一些事
  13. 学以致用三十-----pycharm创建django项目忘记添加app
  14. struts2.1.6 action 01
  15. 1、改变 vs编辑器的主题
  16. sql server 对Geography 的增(insert)和查询(select)
  17. 最全的Markdown语法
  18. iOS开发--地图与定位
  19. Master Sudoku:Get The Skill
  20. Win7下C/C++跨平台开发工具IDE的安装之Eclipse-CDT

热门文章

  1. MAVEN基础讲解
  2. 常用DBhelper封装方法
  3. [react]react创建app,路由,mobx 全教程
  4. ajaxFileUpload上传文件成功后却无法解析服务器返回的json数据
  5. Sky Code(poj3904)
  6. Docker 与 K8S学习笔记(三)—— 镜像的使用
  7. Centos 切换中文输入法
  8. matplotlib 高阶之Transformations Tutorial
  9. A ROBUST KERNEL PCA ALGORITHM
  10. JS运行三部曲(预编译)