c# Parallel.For 并行编程 执行顺序测试
因为有个for 实际执行结果尽管是按照for里边的顺序执行,但处理器让哪个分线程先执行,谁先处理完就不一定了.
对于要求结果需要先后顺序的,比如对text内容的操作, 用并行 Parallel.For 操作,不做进一步优化处理,那结果就不是想要的了,还要l用它的并行的功能所以要多程序进行改进,
我使用的做法是初始化buffer list 把list数组的顺序定下来,在循环中,把对应的值顺序赋值给list. 这样做可能写的有点死,根据实际应用调整启动循环的数量实际运行起来效果不错.
做了个简单的测试,同时赋值多个字符串,打印list字符串的值,
string a = "sssssssssssssssssssssssssssssssssssssssssss";
string b = "jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj";
string c = "nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmm";
string d = "ssssssssssssssssssssssssssssssssssssssssssssssssss";
string o = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
string f = "ttttttttttttttttttttttttttttttttttttttttttttttttttt";
List<string> la = new List<string>();
la.Add(a);
la.Add(b);
la.Add(c);
la.Add(d);
la.Add(o);
la.Add(f);
Parallel.For(, /*portion*/, (i, ParallelLoopState) =>
{
Console.WriteLine(la[i]) ;
});
结果:
顺序大变
再运行一次
因为设置断点,程序停了一会显示按照先后了
在运行一次,去掉断点
总结:对需要先后顺序的操作明显满足不了
本来已经加上一下代码就可以了
if (i == )
{
using (mmf_reader = mmf.CreateViewAccessor(, portion1, MemoryMappedFileAccess.Read))
{
buffer = new byte[portion1]; mmf_reader.ReadArray(, buffer, , (int)portion1);
mappedFiles.Add(new MappedFile
{
Offset =/* i **/ portion1, //fileOffset,
Buffer = buffer,
FileSize = portion1
});
}
}
else if (i == )
{
using (mmf_reader = mmf.CreateViewAccessor(portion1, portion2 - portion1, MemoryMappedFileAccess.Read))
{
buffer = new byte[portion2 - portion1]; mmf_reader.ReadArray(, buffer, , (int)(portion2 - portion1));
mappedFiles.Add(new MappedFile
{
Offset = portion1 + portion2,// i * portionSize, //fileOffset,
Buffer = buffer,
FileSize = portion2 - portion1
});
}
}
else if (i == )
{
using (mmf_reader = mmf.CreateViewAccessor(portion2, portion3 - portion2, MemoryMappedFileAccess.Read))
{
buffer = new byte[portion3 - portion2]; mmf_reader.ReadArray(, buffer, , (int)(portion3 - portion2));
mappedFiles.Add(new MappedFile
{
Offset = portion3 + portion2,// i * portionSize, //fileOffset,
Buffer = buffer,
FileSize = portion3 - portion2
});
}
}
else if (i == )
{
using (mmf_reader = mmf.CreateViewAccessor(portion2, portion3 - portion2, MemoryMappedFileAccess.Read))
{
buffer = new byte[portion3 - portion2]; mmf_reader.ReadArray(, buffer, , (int)(portion3 - portion2));
mappedFiles.Add(new MappedFile
{
Offset = portion3 + portion2,// i * portionSize, //fileOffset,
Buffer = buffer,
FileSize = portion3 - portion2
});
}
}
else if (i == )
{
using (mmf_reader = mmf.CreateViewAccessor(portion3, portion4 - portion3, MemoryMappedFileAccess.Read))
{
buffer = new byte[portion4 - portion3]; mmf_reader.ReadArray(, buffer, , (int)(portion4 - portion3));
mappedFiles.Add(new MappedFile
{
Offset = portion3 + portion2,// i * portionSize, //fileOffset,
Buffer = buffer,
FileSize = portion4 - portion3
});
}
}
else if (i == )
{
using (mmf_reader = mmf.CreateViewAccessor(portion4, portion5 - portion4, MemoryMappedFileAccess.Read))
{
buffer = new byte[portion5 - portion4]; mmf_reader.ReadArray(, buffer, , (int)(portion5 - portion4));
mappedFiles.Add(new MappedFile
{
Offset = portion3 + portion2,// i * portionSize, //fileOffset,
Buffer = buffer,
FileSize = portion5 - portion4
});
}
}
}
以上尽管值加进去了,里边顺序还是变了并行线程用起来还是有些复杂度的,
对以上
mappedFiles 先初始化 ,
mappedFiles = new List<MappedFile>();
//初始化 list 六个
for (int i = ; i < ; i++)
{
MappedFile map = new MappedFile();
mappedFiles.Add(map);
mappedFiles[]=new MappedFile
{
// Offset =/* i **/ portion1, //fileOffset,
Buffer = buffer,
// FileSize = portion1
};
不用list.add的方式,直接赋值方式.问题解决
c# Parallel.For 并行编程 执行顺序测试的更多相关文章
- ORACLE中查询语句的执行顺及where部分条件执行顺序测试
Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...
- Unity脚本在层级面板中的执行顺序测试2
上一篇测试了生成顺序对执行顺序的影响,链接:LINK 执行顺序测试3: LINK 这篇主要测试一下Awake,OnEnable,Start三个常用消息的循环顺序 1.测试消息循环顺序 先上一个最简单的 ...
- Unity脚本在层级面板中的执行顺序测试3
断断续续的写了3篇,以后有时间可以做成一个系列了 前面2篇测试了GameObject的顺序,以及Awake和OnEnable的时机: Unity脚本在层级面板中的执行顺序测试1 http://www. ...
- Unity脚本在层级面板中的执行顺序测试4-附加整理
测试4为一些附加内容,后续的各种tips都加在此. 前几篇测试的链接: Unity脚本在层级面板中的执行顺序测试1 http://www.cnblogs.com/hont/p/4298110.html ...
- Unity脚本在层级面板中的执行顺序测试1
第二篇测试循环时和动态创建时的调用顺序:LINK 测试版本Unity4.6.因为新版本对Transform的排序做了改变,所以不排除旧版本的测试结果不一样.测试时,使用Awake中添加Debug.lo ...
- Spring的Bean的生命周期方法执行顺序测试
通过一个简单的Maven工程来演示Spring的Bean生命周期函数的执行顺序. 下面是工程的目录结构: 直接贴代码: pom.xml文件内容: <?xml version="1.0& ...
- Animation在每一帧中的执行顺序测试
测试代码: void Update() { transform.position = Vector3.zero; } void LateUpdate() { Debug.Log(transform.p ...
- C#并行编程-Parallel
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
随机推荐
- 点击对应不同name的button,显示不同name的弹窗(弹窗功能)
(通过html5方法自定义属性选择,因此会有兼容性,此方法可适用移动端) 将button的name,与弹窗的name设为变量,作为参数传递. Button的name可以是自定义name,HTML5自定 ...
- Delphi中For In 语法应用实例
一.遍历 TStrings var List: TStrings; s: string; begin List := TStringList.Create; List.CommaText := 'aa ...
- C# 根据Excel生成树
需求: 根据Excel生成树,Excel的某些节点为属性节点, 如: 列(桩号.构件编码.测试属性1) 是列(分项工程名称) 的属性,非节点. 列(桩号.构件编码.测试属性1) 以属性的方式存在 导入 ...
- LisView控件
用LisView控件在窗体中创建一个表,设置一个按钮,点击按钮, 将数据库中的表在这个控件中显示(LisView控件中表格式列名与数据库中一致) 首先使用控件将表的每一列创建好,加入一个按钮,如图,现 ...
- vue -- 九宫格抽奖
html: <div class="line_item" :class="index == 1 ? 'active' : 'white_item'"> ...
- 阿里大于发送短信(java)
一.短信签名设置 1.短信签名是什么? 签名是在短信内容开始或者末尾跟的品牌或者应用名称,设置签名有一下几个好处:增加品牌的曝光度,增强用户的记忆让用户能更清楚的知道正在使用的应用. 2.签名可不可以 ...
- 2018面向对象程序设计(Java)第13周学习指导及要求
2018面向对象程序设计(Java)第13周学习指导及要求 (2018.11.22-2018.11.25) 学习目标 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机 ...
- 03_java基础(九)之综合练习与考核评估
25.综合练习之车站业务分析 完成步骤: 需求: 以车站业务对车票做增删改查操作 1.建立数据库 2.建立车票表 3.建立java项目结构(model\dao\service\test) 4.创建mo ...
- Java中字节流如何转字符流,OutputStreamWriter用法
OutputStreamWriter 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:UTF-8: 步骤: 1.创建流 子类对象 绑定数 ...
- Spring启动异常: cvc-elt.1: Cannot find the declaration of element 'beans'(转)
Spring启动异常: cvc-elt.1: Cannot find the declaration of element 'beans' 2008-09-07 22:41 今天把在线聊天室代码改了下 ...