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