protected void ThreadDoFileMD5(List <string> fileList, string[] fileDic)
        {
            List <JobFileMD5>       jobList   = new List <JobFileMD5>();
            List <ManualResetEvent> eventList = new List <ManualResetEvent>();

            int numFiles = fileList.Count;

            for (int i = 0; i < numFiles; i++)
            {
                string     path = fileList[i];
                JobFileMD5 job  = new JobFileMD5(path, i, fileDic);
                jobList.Add(job);
                eventList.Add(job.doneEvent);
                ThreadPool.QueueUserWorkItem(job.ThreadPoolCallback);

                if (eventList.Count >= Environment.ProcessorCount || (i == numFiles - 1 && eventList.Count > 0))
                {
                    WaitHandle.WaitAll(eventList.ToArray());
                    eventList.Clear();
                    AssetDanshariUtility.DisplayThreadProgressBar(numFiles, i);
                }
            }
            foreach (var job in jobList)
            {
                if (!string.IsNullOrEmpty(job.exception))
                {
                    Debug.LogError(job.exception);
                }
            }
        }
        protected void ThreadDoFilesTextSearch(List <string> fileList, List <string> depList, bool[][] rstList)
        {
            List <JobFileTextSearch> jobList   = new List <JobFileTextSearch>();
            List <ManualResetEvent>  eventList = new List <ManualResetEvent>();

            //生成guid字典,快速查询
            Dictionary <string, int> guidDic  = new Dictionary <string, int>();
            List <string>            guidList = AssetDanshariUtility.GuidFromFileList(depList);

            for (int i = 0; i < guidList.Count; i++)
            {
                guidDic[guidList[i]] = i;
            }

            Stopwatch sw       = Stopwatch.StartNew();
            int       numFiles = fileList.Count;
            int       dealNum  = 0;

            for (int i = 0; i < numFiles; i++)
            {
                string            path = fileList[i];
                JobFileTextSearch job;
                if (path == AssetDanshariUtility.Res_Obj || path == AssetDanshariUtility.Res_Pref ||
                    path == AssetDanshariUtility.Res_Sprite)
                {
                    //如果是资源表,直接使用路径进行匹配
                    job = new JobFileTextSearch(path, depList, rstList[i]);
                }
                else
                {
                    if (!AssetDanshariUtility.ValidFileHasRef(path))
                    {
                        continue;
                    }
                    job = new JobFileTextSearch(path, guidDic, rstList[i]);
                }
                jobList.Add(job);
                eventList.Add(job.doneEvent);
                ThreadPool.QueueUserWorkItem(job.ThreadPoolCallback);

                if (eventList.Count >= Environment.ProcessorCount || (i == numFiles - 1 && eventList.Count > 0))
                {
                    dealNum++;
                    WaitHandle.WaitAll(eventList.ToArray());
                    eventList.Clear();
                    AssetDanshariUtility.DisplayThreadProgressBar(numFiles, i);
                }
            }
            Debug.Log("处理次数:" + dealNum + ",耗时:" + sw.ElapsedMilliseconds / 1000f);
            foreach (var job in jobList)
            {
                if (!string.IsNullOrEmpty(job.exception))
                {
                    Debug.LogError(job.exception);
                }
            }
        }
Beispiel #3
0
        protected void ThreadDoFilesTextSearchReplace(List <string> fileList, List <string> patterns, string replaceStr, bool[][] searchRetList)
        {
            List <JobFileTextSearchReplace> jobList   = new List <JobFileTextSearchReplace>();
            List <ManualResetEvent>         eventList = new List <ManualResetEvent>();

            int numFiles    = fileList.Count;
            int numFinished = 0;

            AssetDanshariUtility.DisplayThreadProgressBar(numFiles, numFinished);

            int timeout = 600000;  // 10 分钟超时

            for (var i = 0; i < fileList.Count; i++)
            {
                JobFileTextSearchReplace job = new JobFileTextSearchReplace(fileList[i], patterns, replaceStr, searchRetList[i]);
                jobList.Add(job);
                eventList.Add(job.doneEvent);
                ThreadPool.QueueUserWorkItem(job.ThreadPoolCallback);

                if (eventList.Count >= Environment.ProcessorCount)
                {
                    WaitForDoFile(eventList, timeout);
                    AssetDanshariUtility.DisplayThreadProgressBar(numFiles, numFinished);
                    numFinished++;
                }
            }

            while (eventList.Count > 0)
            {
                WaitForDoFile(eventList, timeout);
                AssetDanshariUtility.DisplayThreadProgressBar(numFiles, numFinished);
                numFinished++;
            }

            foreach (var job in jobList)
            {
                if (!string.IsNullOrEmpty(job.exception))
                {
                    Debug.LogError(job.exception);
                }
            }
        }