首页 新闻 搜索 专区 学院

Parallel并发多线程,高分请教大大

0
悬赏园豆:15 [已解决问题] 解决于 2017-02-17 15:40
 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             });
View Code

代码如上,运行时候貌似发生了死锁,新手实在看不出哪里有问题,代码没有需要lock的地方。

谢谢了

王庆东mas的主页 王庆东mas | 初学一级 | 园豆:4
提问于:2017-01-09 14:42
< >
分享
最佳答案
1

没看到什么地方会出现死锁。

收获园豆:15
Daniel Cai | 专家六级 |园豆:10374 | 2017-01-10 09:24

是file.copy卡了,windows资源管理器繁忙原因

王庆东mas | 园豆:4 (初学一级) | 2017-01-10 09:28

@王庆东mas: 文件拷贝一般也不会把explorer拉的卡吧。你如果手工拷贝呢?如果还卡的话我觉得要怀疑磁盘是否有可能有点问题。

Daniel Cai | 园豆:10374 (专家六级) | 2017-01-10 09:34

@Daniel Cai: 上面代码所示,10次有6次会把explorer.exe搞卡死,得强制重启。

王庆东mas | 园豆:4 (初学一级) | 2017-01-10 09:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册