public void TerminateSearch(SearchWorker worker) { if (WorkerTokenSources.ContainsKey(worker.Id)) { WorkerTokenSources[worker.Id].Cancel(); } }
public async void StartSearch(FileSearchParam param) { var workerTokenSource = new CancellationTokenSource(); var token = workerTokenSource.Token; var searcher = CreateSearcher(token, param.PlugName); searcher.OnSearchStarted += searcher_OnSearchStarted; searcher.OnFileFound += searcher_OnFileFound; var worker = new SearchWorker { Id = searcher.Id, FilesFound = 0, Parameter = param, Status = WorkerStatus.Pending.ToString() }; SearchWorkers.Add(worker); WorkerTokenSources.Add(searcher.Id, workerTokenSource); try { await Task.Factory.StartNew(() => searcher.Search(param)); } catch (OperationCanceledException) { // handle task cancelation Debug.WriteLine("Search canseled: {0}", searcher.Id); worker.Status = WorkerStatus.Stopped.ToString(); return; } catch (Exception ex) { // other exception occured Debug.WriteLine(ex); } finally { WorkerTokenSources.Remove(searcher.Id); } worker.Status = WorkerStatus.Finished.ToString(); }