예제 #1
0
        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();
        }
예제 #2
0
		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();
		}