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); } } }
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); } } }