public HotelSearchResponse GetSearchResult(SearchData searchData) { try { var tasks = new List <Task>(); var tokenSource1 = new CancellationTokenSource(); var tokenSource2 = new CancellationTokenSource(); List <HotelSearchResult> searchResults = new List <HotelSearchResult>(); HotelSearchResponse searchResponse = new HotelSearchResponse(); SessionManager sessionManager = new SessionManager(); // add validation if (!ValidateSearchData(searchData)) { searchResponse.Status = 1; // invalid data return(searchResponse); } // sure if session vaild ******** if (sessionManager.ValidSession(searchData)) { // get hotel data From DB SessionRepo sessionRepo = new SessionRepo(); var HotelSRes = sessionRepo.GetDataBySession(searchData); if (HotelSRes != null) { return(HotelSRes); } return(null); } //MG data not found in db new SID searchData = PrepareSearchData(searchData); if (searchData != null) { using (ProviderManager pm = new ProviderManager()) { pm.searchData = searchData; pm.GetHotelSearchResultForAllProviders(); // searchResults = pm.HotelSearchResults; // searchResults = GetLowestPrice(searchResults); searchResponse = pm.searchResponse; //searchResults = GetLowestPrice(searchResponse.HotelResult); searchResults = searchResponse.HotelResult; searchResponse.HotelResult = searchResults; searchResponse.Locations = searchResponse.HotelResult.GroupBy(x => x.Location).Select(x => x.FirstOrDefault()).Select(a => a.Location).ToList(); tasks.Add(Task.Factory.StartNew(() => { if (searchResults.Count > 0) { SaveSearchResult(searchResults, searchData.sID);///////////////// } }, tokenSource1.Token)); Task.WaitAll(tasks.ToArray()); } } return(searchResponse); } catch (HotelSearchInputException EX) { return(new HotelSearchResponse() { Status = 1, //"Invalid" ResultException = new ResultException() { Code = EX.Code, ExceptionMessage = EX.Message } }); } catch (Exception ex) { LoggingHelper.WriteToFile("SearchController/Errors/", "SearchController" + "INServOrch" + searchData.sID, ex.InnerException?.Message, ex.Message + ex.StackTrace); return(new HotelSearchResponse()); } }