public async Task <List <SearchResult> > GetWebResults(MainViewModel model) { List <List <SearchResult> > searchResults = new List <List <SearchResult> >(); List <SearchEngine> engines = model.Context.Engines.ToList(); Task <List <SearchResult> >[] tasks = new Task <List <SearchResult> > [engines.Count]; int taskNum = 0; try { foreach (SearchEngine engine in engines) { switch (engine.EngineId) { case (int)EnginesEnum.Google: WebSearch GSearch = new Google(model, engine); tasks[taskNum] = Task.Run(() => GSearch.GetResultsAsync()); break; case (int)EnginesEnum.Yandex: WebSearch YSearch = new Yandex(model, engine); tasks[taskNum] = Task.Run(() => YSearch.GetResultsAsync()); break; case (int)EnginesEnum.Bing: WebSearch BSearch = new Bing(model, engine); tasks[taskNum] = Task.Run(() => BSearch.GetResultsAsync()); break; default: return(new List <SearchResult>()); } } } catch (Exception ex) { await model.Context.Logs.AddAsync(new Log { EngineId = 0, DateStamp = DateTime.Now.ToString(), Message = $"Data search error. Message: {ex.Message}" }); } var firstResult = await Task.WhenAny(tasks.Where(t => t != null)).Result; await Task.WhenAll(tasks.Where(t => t != null).ToArray()); return(firstResult); }