예제 #1
0
        public Result Search(String searchLine)
        {
            Result result = new Result();

            Task.Factory.StartNew(() =>
            {
                CancellationToken token = result.GetToken();
                Tuner tuner             = null;
                for (int i = 0; i < threadCount; i++)
                {
                    if (token.IsCancellationRequested)
                    {
                        continue;
                    }
                    Checker currentChecker = checkers[i];
                    Tuner prevTuner        = tuner;
                    tuner = currentChecker.Check(searchLine, result, prevTuner);
                }
                if (tuner != null && !token.IsCancellationRequested)
                {
                    tuner.SetSecond(string.Empty);
                }
            });

            return(result);
        }
예제 #2
0
파일: Checker.cs 프로젝트: mititch/Searcher
        public Tuner Check(String searchLine, Result result, Tuner prevTuner)
        {
            Tuner thisTuner = inTune == 0 ? new Tuner(this, searchLine, result) : null;

            //блокировок еще нет и тюнинг может измениться но обрабатываться строка будет тюнингом

            Task.Factory.StartNew(() =>
            {
                CancellationToken token = result.GetToken();
                if (token.IsCancellationRequested)
                {
                    return;
                }

                var hashtable = hashRef.Target as Hashtable; //root захвачен таблица не может быть уничтожена
                if (hashtable == null)
                {
                    //это первый проход или проход или проход с разрушенной таблицей (но с известной первой и последней строкой)
                    lockS.EnterWriteLock();
                    if (token.IsCancellationRequested)
                    {
                        return;
                    }
                    hashtable           = this.Parse(searchLine, result, thisTuner, prevTuner, token);
                    this.hashRef.Target = hashtable;
                    lockS.ExitWriteLock();
                }
                else
                {
                    //это уже не первые проход и мы прошли коллекцию до конца
                    //знаем первую и последнюю строку

                    lockS.EnterReadLock();
                    //если чекер успел стать интуном можем уничтожить тюнер!!!!!!!!!!!! и прочитать все из таблицы
                    if (this.inTune == 1)
                    {
                        thisTuner = null;
                    }
                    if (hashtable.Contains(searchLine))
                    {
                        result.Increace((int)hashtable[searchLine]);
                    }
                    lockS.ExitReadLock();
                }

                if (prevTuner != null)
                {
                    prevTuner.SetSecond(this.firstSubline);
                }

                if (thisTuner != null)
                {
                    //если уж тюнер создан и дожил досюда выполняем
                    //hashtable не может быть уничтожена пока содержится в тюнере
                    //если тюнер созавался то только он может проверить последнн значение
                    //и хештаблицу изменит он (или первый один из них)
                    thisTuner.SetFirst(hashtable); // передача захвата таблицы тюнеру
                }
            });

            return(thisTuner);
        }