1 Parallel.ForEach(allFileName, new ParallelOptions() { MaxDegreeOfParallelism = maxPThread }, (q, loopstate) => 2 { 3 int currenThid = Thread.CurrentThread.ManagedThreadId; 4 DirectoryInfo tempDir = new DirectoryInfo(q); 5 Match ma = rgd.Match(q); 6 if (ma.Success) 7 { 8 string oldApplyCode = q.Substring(q.LastIndexOf("\\") + 1, q.Length - 1 - q.LastIndexOf("\\")); 9 string date = ma.ToString().Substring(0, 8); //201504120004 -> 20150412 10 string year = ma.ToString().Substring(0, 4);//2015 11 string month = ma.ToString().Substring(4, 2);//04 12 string day = ma.ToString().Substring(6, 2);//12 13 14 string dirRoot1 = desDir + @"\" + year; 15 string dirRoot2 = desDir + @"\" + year + @"\" + month; 16 string dirRoot3 = desDir + @"\" + year + @"\" + month + @"\" + day; 17 string dirRoot4 = desDir + @"\" + year + @"\" + month + @"\" + day + @"\" + oldApplyCode; 18 19 FileInfo[] fileInfo = tempDir.GetFiles(); 20 foreach (FileInfo NextFile in fileInfo) //遍历文件 21 { 22 string sName = NextFile.Name.Substring(NextFile.Name.LastIndexOf("\\") + 1, NextFile.Name.Length - 1 - NextFile.Name.LastIndexOf("\\")); 23 24 string fileSrc = q + @"\" + NextFile.Name; 25 string fileDes = dirRoot4 + @"\" + sName; 26 27 //复制操作 28 File.Copy(fileSrc, fileDes, true); 29 //File.Move(fileSrc, fileDes); 30 //addUIText(string.Format("->正在同步,*旧文件:{0},*新文件:{1},成功!", fileSrc, fileDes)); 31 32 this.Invoke(new Action(() => 33 { 34 progressBar1.PerformStep(); 35 this.Text = "正在同步文件,剩余待同步文件数:" + (--allFileCount) + "/" + allFileCount1 + ",ThreadId-" + currenThid; 36 })); 37 38 } 39 } 40 });
代码如上,运行时候貌似发生了死锁,新手实在看不出哪里有问题,代码没有需要lock的地方。
谢谢了
没看到什么地方会出现死锁。
是file.copy卡了,windows资源管理器繁忙原因
@王庆东mas: 文件拷贝一般也不会把explorer拉的卡吧。你如果手工拷贝呢?如果还卡的话我觉得要怀疑磁盘是否有可能有点问题。
@Daniel Cai: 上面代码所示,10次有6次会把explorer.exe搞卡死,得强制重启。