private string AddDir(DirectoryInfo dir) { List <FileInfo> fileInfos = new List <FileInfo>(); Dirs["" + dir.FullName] = fileInfos; var maxPb = new invClear(MaxProcess); var add = new invClear(AddProcess); single.QueueWorkItem(() => Invoke(maxPb)); var remove = new invRemove(clistDirs.Items.Remove); waitQueue.Add(pool.QueueWorkItem(() => { var files = dir.GetFiles(); Console.WriteLine("读取文件信息:" + files.Length); if (files != null && files.Length > 0) { fileInfos.AddRange(files); Console.WriteLine("+>" + files.Length); } else { Dirs.TryRemove(dir.FullName, out fileInfos); single.QueueWorkItem(() => Invoke(remove, new object[] { GetShorten(dir.FullName) })); } single.QueueWorkItem(() => Invoke(add)); })); return(dir.FullName); }
private void CheckFiles(object checkedObject = null, bool isChecked = false) { cyborgCheck = false; var clist = new ArrayList(clistDirs.CheckedItems); var setStatus = new invClear(ChangeStatus); if (checkedObject != null && !isChecked && !clist.Contains(checkedObject)) { clist.Add(checkedObject); } else { clist.Remove(checkedObject); } var waitFor = waitQueue.ToArray <IWorkItemResult>(); var browseClear = new invClear(listBrowse.Items.Clear); var lostClear = new invClear(listLost.Items.Clear); var browseAddRange = new invAddRang(listBrowse.Items.AddRange); var lostAddRange = new invAddRang(listLost.Items.AddRange); var maxPb = new invClear(MaxProcess); var add = new invClear(AddProcess); Invoke(maxPb); var work = pool.QueueWorkItem(() => { var browse = new List <FileInfo>(); var lost = new List <string>(); SmartThreadPool.WaitAll(waitFor); waitQueue.RemoveAll(q => waitFor.Contains <IWorkItemResult>(q)); Parallel.For(0, clist.Count, i => { Invoke(maxPb); try { var item = shorten + clist[i].ToString(); if (cacheBrowse.ContainsKey(item) && cacheLost.ContainsKey(item)) { browse.AddRange(cacheBrowse[item]); lost.AddRange(cacheLost[item]); return; } var files = from f in Dirs[item] orderby f.FullName descending select f; if (files == null || files.Count <FileInfo>() == 0) { return; } Console.WriteLine($"==>{item.GetType()} {item} {files.Count<FileInfo>()}"); browse.AddRange(files); var thislLost = CheckContinuous(files.ToArray <FileInfo>()); lost.AddRange(thislLost); cacheBrowse[item] = files; cacheLost[item] = thislLost; } catch (Exception ex) { System.Console.WriteLine(ex.Message + ex.StackTrace); } finally { Invoke(add); } }); Invoke(browseClear); Invoke(lostClear); Invoke(browseAddRange, new object[] { Array.ConvertAll <FileInfo, string>(browse.ToArray(), f => GetShorten(f.FullName)) }); Invoke(lostAddRange, new object[] { Array.ConvertAll <string, string>(lost.ToArray(), s => GetShorten(s)) }); single.QueueWorkItem(() => Invoke(setStatus)); Invoke(add); }); waitQueue.Add(work); Invoke(new invProcess(AddProcess), new object[] { 100 }); waitQueue.Add(pool.QueueWorkItem(() => { SmartThreadPool.WaitAll(new IWaitableResult[] { work }); Invoke(new invClear(ResetProcess)); single.QueueWorkItem(() => Invoke(setStatus)); //Interaction.MsgBox("查询完成!", MsgBoxStyle.Information); })); }