コード例 #1
0
ファイル: MainForm.cs プロジェクト: lucloner/CountDownk-Nload
        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);
        }
コード例 #2
0
ファイル: MainForm.cs プロジェクト: lucloner/CountDownk-Nload
        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);
            }));
        }