// 传入MemoryMappedViewAccessor,加密,解密 private int EncryptDecrypt3(object arg0)// MemoryMappedViewAccessor accessor, Int64 size) { MemoryMappedViewAccessor accessor; Int64 size; exe_to_thread et = (exe_to_thread)arg0; accessor = et.accessor; size = et.size; //写入文件源数据 int readCount = 0; //每次读16个字节为一次加密分组 byte[] buffer = new byte[1024]; Int64 pos = 0; Console.WriteLine("文件线程编号:" + et.ft_threadnum.ToString() + "。处理线程编号:" + et.et_threadnum.ToString()); while ((size - pos) > 0) { byte[] temp = null; // 剩余的字节数大于1024 if ((size - pos) > buffer.Length) { for (int index = 0; index < buffer.Length; index++) { buffer[index] = accessor.ReadByte(pos + index); } temp = buffer; } else { for (int index = 0; index < size - pos; index++) { buffer[index] = accessor.ReadByte(pos + index); readCount++; } temp = new byte[readCount]; Buffer.BlockCopy(buffer, 0, temp, 0, readCount); } if (flag) // 加密 { temp = sM4Utils.encryptECB(secruitKey, false, temp); } else // 解密 { temp = sM4Utils.decryptECB(secruitKey, false, temp); } for (int i = 0; i < temp.Length; i++) { accessor.Write(pos + i, ref temp[i]); } pos += temp.Length; } Console.WriteLine("文件线程编号:" + et.ft_threadnum.ToString() + "。处理线程编号:" + et.et_threadnum.ToString() + "处理完成"); //accessor.Dispose(); et.accessor.Dispose(); return(et.et_threadnum); }
/// <summary> /// 引用内存映射文件 /// </summary> /// <summary> /// 用于访问内存映射文件的存取对象 /// </summary> /// <summary> /// 创建内存映射文件 /// </summary> private int CreateMemoryMapFile(object arg0)//(string srcFile, int num) { MemoryMappedFile memoryFile = null; //MemoryMappedViewAccessor accessor1;// accessor; file_to_thread ft = (file_to_thread)arg0; string srcFile = ft.filename; try { FileInfo fi = new FileInfo(srcFile); // 单位:字节 // total size in bytes Int64 size = fi.Length; Int64 minSize = 1024 * 1024 * 100; Int64 minSize2 = 1024 * 1024 * 400; Int64 maxSize = 1024 * 1024 * 100; currentFileName = "正在处理第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) + ",文件大小:" + size / 1024 / 1024 + "MB"; bw.ReportProgress(ft.filenum); Console.WriteLine("处理的文件:" + srcFile + "。文件序号:" + ft.filenum.ToString() + "。文件线程编号:" + ft.threadnum.ToString() + "。文件大小:" + size); //Int64 proSize = 0; //Int64 fileToRead = size;//文件总的大小 memoryFile = MemoryMappedFile.CreateFromFile(srcFile, FileMode.Open, "fileencrypt" + ft.filenum.ToString(), size); // 四个线程处理,平均分成四份 if (size <= minSize) { exe_to_thread et; et.accessor = memoryFile.CreateViewAccessor(0, size); et.ft_threadnum = ft.threadnum; et.size = size; et.et_threadnum = 0; var result = Task.Run(() => EncryptDecrypt0(et)); Console.WriteLine("主线程不会阻塞,它会继续执行"); Console.WriteLine("子任务的返回值分别为:{0}", result.Result); currentFileName = "第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) + ",文件大小:" + size / 1024 / 1024 + "MB,当前进度:" + 100 + "%"; bw.ReportProgress(ft.filenum); et.accessor.Dispose(); } else if (size > minSize && size <= minSize2) { Int64 proSize = size / 4; exe_to_thread[] ets = new exe_to_thread[4]; ets[0].accessor = memoryFile.CreateViewAccessor(0, proSize); ets[1].accessor = memoryFile.CreateViewAccessor(proSize, proSize); ets[2].accessor = memoryFile.CreateViewAccessor(2 * proSize, proSize); ets[3].accessor = memoryFile.CreateViewAccessor(3 * proSize, size - 3 * proSize); ets[0].ft_threadnum = ft.threadnum; ets[0].et_threadnum = 0; ets[0].size = proSize; ets[1].ft_threadnum = ft.threadnum; ets[1].et_threadnum = 1; ets[1].size = proSize; ets[2].ft_threadnum = ft.threadnum; ets[2].et_threadnum = 2; ets[2].size = proSize; ets[3].ft_threadnum = ft.threadnum; ets[3].et_threadnum = 3; ets[3].size = size - 3 * proSize; var parentTask = new Task <int[]>(() => { //开启多个子任务 var results = new int[4]; //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行 //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题 new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[2] = EncryptDecrypt2(ets[2]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[3] = EncryptDecrypt3(ets[3]), TaskCreationOptions.AttachedToParent).Start(); return(results); }); parentTask.Start(); Console.WriteLine("主线程不会阻塞,它会继续执行"); foreach (var re in parentTask.Result) { Console.WriteLine("子任务的返回值分别为:{0}", re); } currentFileName = "第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) + ",文件大小:" + size / 1024 / 1024 + "MB,当前进度:" + 100 + "%"; bw.ReportProgress(ft.filenum); ets[0].accessor.Dispose(); ets[1].accessor.Dispose(); ets[2].accessor.Dispose(); ets[3].accessor.Dispose(); } else { Int64 total_count = size / maxSize; if (size % maxSize != 0) { total_count++; } Int64 counts = 0; Int64 remainSize = size; // 同时分配的不超过500MB,每次分配100M while ((total_count - counts) > 0) { Int64 temp_count; Int64 temp_size = 0;; if ((total_count - counts) >= 4) { temp_count = 4; } else { temp_count = (total_count - counts); } exe_to_thread[] ets = new exe_to_thread[temp_count]; if (temp_count == 4) { ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, maxSize); ets[1].accessor = memoryFile.CreateViewAccessor((counts + 1) * maxSize, maxSize); ets[2].accessor = memoryFile.CreateViewAccessor((counts + 2) * maxSize, maxSize); if ((remainSize - 3 * maxSize) >= maxSize) { temp_size = maxSize; } else { temp_size = remainSize - 3 * maxSize; } ets[3].accessor = memoryFile.CreateViewAccessor((counts + 3) * maxSize, temp_size); ets[0].ft_threadnum = ft.threadnum; ets[0].et_threadnum = 0; ets[0].size = maxSize; ets[1].ft_threadnum = ft.threadnum; ets[1].et_threadnum = 1; ets[1].size = maxSize; ets[2].ft_threadnum = ft.threadnum; ets[2].et_threadnum = 2; ets[2].size = maxSize; ets[3].ft_threadnum = ft.threadnum; ets[3].et_threadnum = 3; ets[3].size = temp_size; var parentTask = new Task <int[]>(() => { //开启多个子任务 var results = new int[temp_count]; //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行 //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题 new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[2] = EncryptDecrypt2(ets[2]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[3] = EncryptDecrypt3(ets[3]), TaskCreationOptions.AttachedToParent).Start(); return(results); }); parentTask.Start(); Console.WriteLine("主线程不会阻塞,它会继续执行"); foreach (var re in parentTask.Result) { Console.WriteLine("子任务的返回值分别为:{0}", re); } ets[0].accessor.Dispose(); ets[1].accessor.Dispose(); ets[2].accessor.Dispose(); ets[3].accessor.Dispose(); } else if (temp_count == 3) { ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, maxSize); ets[1].accessor = memoryFile.CreateViewAccessor((counts + 1) * maxSize, maxSize); if ((remainSize - 2 * maxSize) >= maxSize) { temp_size = maxSize; } else { temp_size = remainSize - 2 * maxSize; } ets[2].accessor = memoryFile.CreateViewAccessor((counts + 2) * maxSize, temp_size); ets[0].ft_threadnum = ft.threadnum; ets[0].et_threadnum = 0; ets[0].size = maxSize; ets[1].ft_threadnum = ft.threadnum; ets[1].et_threadnum = 1; ets[1].size = maxSize; ets[2].ft_threadnum = ft.threadnum; ets[2].et_threadnum = 2; ets[2].size = temp_size; var parentTask = new Task <int[]>(() => { //开启多个子任务 var results = new int[temp_count]; //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行 //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题 new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[2] = EncryptDecrypt2(ets[2]), TaskCreationOptions.AttachedToParent).Start(); return(results); }); parentTask.Start(); Console.WriteLine("主线程不会阻塞,它会继续执行"); foreach (var re in parentTask.Result) { Console.WriteLine("子任务的返回值分别为:{0}", re); } ets[0].accessor.Dispose(); ets[1].accessor.Dispose(); ets[2].accessor.Dispose(); } else if (temp_count == 2) { ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, maxSize); if ((remainSize - maxSize) >= maxSize) { temp_size = maxSize; } else { temp_size = remainSize - maxSize; } ets[1].accessor = memoryFile.CreateViewAccessor((counts + 1) * maxSize, temp_size); ets[0].ft_threadnum = ft.threadnum; ets[0].et_threadnum = 0; ets[0].size = maxSize; ets[1].ft_threadnum = ft.threadnum; ets[1].et_threadnum = 1; ets[1].size = temp_size; var parentTask = new Task <int[]>(() => { //开启多个子任务 var results = new int[temp_count]; //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行 //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题 new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start(); new Task(() => results[1] = EncryptDecrypt1(ets[1]), TaskCreationOptions.AttachedToParent).Start(); return(results); }); parentTask.Start(); Console.WriteLine("主线程不会阻塞,它会继续执行"); foreach (var re in parentTask.Result) { Console.WriteLine("子任务的返回值分别为:{0}", re); } ets[0].accessor.Dispose(); ets[1].accessor.Dispose(); } else if (temp_count == 1) { if ((remainSize - maxSize) >= maxSize) { temp_size = maxSize; } else { temp_size = remainSize;// - maxSize; } ets[0].accessor = memoryFile.CreateViewAccessor(counts * maxSize, temp_size); ets[0].ft_threadnum = ft.threadnum; ets[0].et_threadnum = 0; ets[0].size = temp_size; var parentTask = new Task <int[]>(() => { //开启多个子任务 var results = new int[temp_count]; //创建子任务,并将子任务的值赋给results变量,并通过TaskCreationOptions.AttachedToParent,将其关联到父任务,如果不指定,该任务将独立于父任务单独执行 //这里有个奇怪的问题,只能使用new Task的方式去创建关联到父任务的子任务,因为Task.Run没有提供这个方法,可以通过扩展方法解决这个问题 new Task(() => results[0] = EncryptDecrypt0(ets[0]), TaskCreationOptions.AttachedToParent).Start(); return(results); }); parentTask.Start(); Console.WriteLine("主线程不会阻塞,它会继续执行"); foreach (var re in parentTask.Result) { Console.WriteLine("子任务的返回值分别为:{0}", re); } ets[0].accessor.Dispose(); } remainSize = remainSize - (temp_count - 1) * maxSize - temp_size; currentFileName = "第" + (ft.filenum + 1) + "个文件:" + srcFile.Substring(srcFile.LastIndexOf('\\') + 1) + ",文件大小:" + size / 1024 / 1024 + "MB,当前进度:" + (size - remainSize) * 100 / size + "%";; bw.ReportProgress(ft.filenum); counts += temp_count; } } Console.WriteLine("文件:" + srcFile + "处理完成"); memoryFile.Dispose(); } catch (Exception ex) { throw; } return(ft.threadnum); }