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