因为有个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 并行编程 执行顺序测试的更多相关文章

  1. ORACLE中查询语句的执行顺及where部分条件执行顺序测试

    Oracle中的一些查询语句及其执行顺序 原文地址:https://www.cnblogs.com/likeju/p/5039115.html 查询条件: 1)LIKE:模糊查询,需要借助两个通配符, ...

  2. Unity脚本在层级面板中的执行顺序测试2

    上一篇测试了生成顺序对执行顺序的影响,链接:LINK 执行顺序测试3: LINK 这篇主要测试一下Awake,OnEnable,Start三个常用消息的循环顺序 1.测试消息循环顺序 先上一个最简单的 ...

  3. Unity脚本在层级面板中的执行顺序测试3

    断断续续的写了3篇,以后有时间可以做成一个系列了 前面2篇测试了GameObject的顺序,以及Awake和OnEnable的时机: Unity脚本在层级面板中的执行顺序测试1 http://www. ...

  4. Unity脚本在层级面板中的执行顺序测试4-附加整理

    测试4为一些附加内容,后续的各种tips都加在此. 前几篇测试的链接: Unity脚本在层级面板中的执行顺序测试1 http://www.cnblogs.com/hont/p/4298110.html ...

  5. Unity脚本在层级面板中的执行顺序测试1

    第二篇测试循环时和动态创建时的调用顺序:LINK 测试版本Unity4.6.因为新版本对Transform的排序做了改变,所以不排除旧版本的测试结果不一样.测试时,使用Awake中添加Debug.lo ...

  6. Spring的Bean的生命周期方法执行顺序测试

    通过一个简单的Maven工程来演示Spring的Bean生命周期函数的执行顺序. 下面是工程的目录结构: 直接贴代码: pom.xml文件内容: <?xml version="1.0& ...

  7. Animation在每一帧中的执行顺序测试

    测试代码: void Update() { transform.position = Vector3.zero; } void LateUpdate() { Debug.Log(transform.p ...

  8. C#并行编程-Parallel

    菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...

  9. 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 ...

随机推荐

  1. postmessage/cors跨域postMessage、xhr2和xmldomain

    一.h5 postMessage node http-server配置服务器 有关配置:请参考我的http://www.cnblogs.com/leee/p/5502727.html 我把文件夹a配置 ...

  2. getElementsByTagName

    1.getElementsByTagName * document.getelementByID(id名称)* 通过id名称获取元素,它只有一个主语,docment(整个文档)** getElemne ...

  3. 把Swift中的String转成NSString ,获取NSString的方法

    1.0 在Swift中的 String 并没有提供什么方法,直接把它自身转变成 Int .Float 等,而在OC中我们就可以这样  "123".integerValue 来获取它 ...

  4. ROC,AUC,Precision,Recall,F1的介绍与计算(转)

    1. 基本概念 1.1 ROC与AUC ROC曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,ROC曲线称为受试者工作特征曲线 (receiver operatin ...

  5. InvalidArgumentError (see above for traceback): Assign requires shapes of both tensors to match. lhs shape= [2048,38] rhs shape= [2048,2]

    做tensorflow object detection 中,清空下checkpoint就可以啦

  6. 修改redis 持久化路径和日志 路径 ,修改kafka日志路径

    redis修改持久化路径和日志路径 vim redis.conf logfile /data/redis_cache/logs/redis.log #日志路径 dir /data/redis_cach ...

  7. intelliJ IDEA 破解,亲测有效

    https://blog.csdn.net/shengshengshiwo/article/details/79599761

  8. pyhton笔记(一):字符编码、变量

    一.什么是python? python是一种面向对象.解释型的计算机语言,它的特点是语法简洁.优雅.简单易学. 编译型语言: 写好代码之后把代码编译成二进制文件,运行时运行编译好的二进制文件.比如C. ...

  9. Integer 原码解读

    有一天,突然发现,阅读原码可以发现很多有趣的东西.在Java中,我们知道很多东西都是封装好的,拿来即用,当你有一天去研究它拿来的东西是如何具体操作的,将会是非常有趣的事情. 在上一篇研究HashMap ...

  10. jQuery插件开发的两种方法及$.fn.extend的详解(转)

    jQuery插件开发的两种方法及$.fn.extend的详解 jQuery插件开发分为两种:1 类级别.2 对象级别,下面为大家详细介绍下   jQuery插件开发分为两种: 1 类级别 类级别你可以 ...