public void DoFilter(FilterParams filterParams, int startLine, int maxCount, ProgressCallback progressCallback) { FilterResultLines.Clear(); LastFilterLinesList.Clear(); FilterHitList.Clear(); _filterHitDict.Clear(); _filterReadyList.Clear(); _filterResultDict.Clear(); _lastFilterLinesDict.Clear(); _filterReadyList.Clear(); _filterWorkerList.Clear(); _shouldStop = false; int interval = maxCount / ThreadCount; if (interval < 1) { interval = 1; } int workStartLine = startLine; List <WaitHandle> handleList = new List <WaitHandle>(); _progressLineCount = 0; _progressCallback = progressCallback; while (workStartLine < startLine + maxCount) { if (workStartLine + interval > maxCount) { interval = maxCount - workStartLine; if (interval == 0) { break; } } _logger.Info("FilterStarter starts worker for line {0}, lineCount {1}", workStartLine, interval); WorkerFx workerFx = DoWork; IAsyncResult ar = workerFx.BeginInvoke(filterParams, workStartLine, interval, ThreadProgressCallback, FilterDoneCallback, workerFx); workStartLine += interval; handleList.Add(ar.AsyncWaitHandle); } WaitHandle[] handles = handleList.ToArray(); // wait for worker threads completion if (handles.Length > 0) { WaitHandle.WaitAll(handles); } MergeResults(); }
public void DoFilter(FilterParams filterParams, int startLine, int maxCount, ProgressCallback progressCallback) { FilterResultLines.Clear(); LastFilterLinesList.Clear(); FilterHitList.Clear(); _filterHitDict.Clear(); _filterReadyList.Clear(); _filterResultDict.Clear(); _lastFilterLinesDict.Clear(); _filterReadyList.Clear(); _filterWorkerList.Clear(); _shouldStop = false; int interval = maxCount / ThreadCount; if (interval < 1) { interval = 1; } int workStartLine = startLine; List<WaitHandle> handleList = new List<WaitHandle>(); _progressLineCount = 0; _progressCallback = progressCallback; while (workStartLine < startLine + maxCount) { if (workStartLine + interval > maxCount) { interval = maxCount - workStartLine; if (interval == 0) { break; } } Logger.logInfo("FilterStarter starts worker for line " + workStartLine + ", lineCount " + interval); WorkerFx workerFx = new WorkerFx(DoWork); IAsyncResult ar = workerFx.BeginInvoke(filterParams, workStartLine, interval, ThreadProgressCallback, FilterDoneCallback, workerFx); workStartLine += interval; handleList.Add(ar.AsyncWaitHandle); } WaitHandle[] handles = handleList.ToArray(); // wait for worker threads completion if (handles.Length > 0) { WaitHandle.WaitAll(handles); } MergeResults(); }