因为有个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(0, 6 /*portion*/, (i, ParallelLoopState) => { Console.WriteLine(la[i]) ; });
结果:
顺序大变
再运行一次
因为设置断点,程序停了一会显示按照先后了
在运行一次,去掉断点
总结:对需要先后顺序的操作明显满足不了
本来已经加上一下代码就可以了
if (i == 0) { using (mmf_reader = mmf.CreateViewAccessor(0, portion1, MemoryMappedFileAccess.Read)) { buffer = new byte[portion1]; mmf_reader.ReadArray(0, buffer, 0, (int)portion1); mappedFiles.Add(new MappedFile { Offset =/* i **/ portion1, //fileOffset, Buffer = buffer, FileSize = portion1 }); } } else if (i == 1) { using (mmf_reader = mmf.CreateViewAccessor(portion1, portion2 - portion1, MemoryMappedFileAccess.Read)) { buffer = new byte[portion2 - portion1]; mmf_reader.ReadArray(0, buffer, 0, (int)(portion2 - portion1)); mappedFiles.Add(new MappedFile { Offset = portion1 + portion2,// i * portionSize, //fileOffset, Buffer = buffer, FileSize = portion2 - portion1 }); } } else if (i == 2) { using (mmf_reader = mmf.CreateViewAccessor(portion2, portion3 - portion2, MemoryMappedFileAccess.Read)) { buffer = new byte[portion3 - portion2]; mmf_reader.ReadArray(0, buffer, 0, (int)(portion3 - portion2)); mappedFiles.Add(new MappedFile { Offset = portion3 + portion2,// i * portionSize, //fileOffset, Buffer = buffer, FileSize = portion3 - portion2 }); } } else if (i == 3) { using (mmf_reader = mmf.CreateViewAccessor(portion2, portion3 - portion2, MemoryMappedFileAccess.Read)) { buffer = new byte[portion3 - portion2]; mmf_reader.ReadArray(0, buffer, 0, (int)(portion3 - portion2)); mappedFiles.Add(new MappedFile { Offset = portion3 + portion2,// i * portionSize, //fileOffset, Buffer = buffer, FileSize = portion3 - portion2 }); } } else if (i == 4) { using (mmf_reader = mmf.CreateViewAccessor(portion3, portion4 - portion3, MemoryMappedFileAccess.Read)) { buffer = new byte[portion4 - portion3]; mmf_reader.ReadArray(0, buffer, 0, (int)(portion4 - portion3)); mappedFiles.Add(new MappedFile { Offset = portion3 + portion2,// i * portionSize, //fileOffset, Buffer = buffer, FileSize = portion4 - portion3 }); } } else if (i == 5) { using (mmf_reader = mmf.CreateViewAccessor(portion4, portion5 - portion4, MemoryMappedFileAccess.Read)) { buffer = new byte[portion5 - portion4]; mmf_reader.ReadArray(0, buffer, 0, (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 = 0; i < 6; i++) { MappedFile map = new MappedFile(); mappedFiles.Add(map);
mappedFiles[0]=new MappedFile { // Offset =/* i **/ portion1, //fileOffset, Buffer = buffer, // FileSize = portion1 };
不用list.add的方式,直接赋值方式.问题解决