private static void ProcessParallel(string datasetId, VehicleIdsResponse vehicleIdsResponse) { // Use ConcurrentQueue to enable safe enqueueing from multiple threads. var exceptions = new ConcurrentQueue <Exception>(); // Execute the complete loop and capture all exceptions. Parallel.ForEach(vehicleIdsResponse.VehicleIds, vehicleId => { if (vehicleId.HasValue) { try { VehicleAndDealerAsync(datasetId, vehicleId.Value).Wait(); } // Store the exception and continue with the loop. catch (Exception e) { exceptions.Enqueue(e); } } }); // Throw the exceptions here after the loop completes. if (exceptions.Count > 0) { throw new AggregateException(exceptions); } }
/// <summary> /// Vehicle Factory /// Gets list of vehicles using passed dataset ID /// creates task factory and task for each vehicle ID, once tasks complete, format answer /// </summary> /// <param name="datasetId">string</param> /// <returns></returns> public async Task <List <DealerAnswer> > GetListOfVehicles(string datasetId) { List <DealerAnswer> dealerAnswers = new List <DealerAnswer>(); VehicleIdsResponse vehicleIdResponse = vehiclesApi.GetIds(datasetId); if (vehicleIdResponse?.VehicleIds != null) { var taskList = new List <Task>(); SynchronizationContext.SetSynchronizationContext(new SynchronizationContext()); //get data for each vehicle foreach (int vehicleId in vehicleIdResponse.VehicleIds) { //create new task factory and add to task list for each vehicle returned in dataset taskList.Add( Task.Factory.StartNew(async() => { return(await GetVehicleResponseTask(datasetId, vehicleId)); }) .ContinueWith((t1) => dealersFactory.GetDealerResponseTask(datasetId, (int)t1.Result.Result.DealerId), TaskScheduler.FromCurrentSynchronizationContext()) ); } //wait for all tasks to finish before formatting final answer Task.WaitAll(taskList.ToArray()); dealerAnswers = dealersFactory.FormatAnswer(vehicles); } else { throw new ApiException(404, "No vehicle IDs found."); } return(dealerAnswers); }
public async Task <List <int> > GetVehiclesListAsync(string datasetId) { var response = await _httpclient.GetAsync($"{_baseUrl}/{datasetId}/vehicles"); VehicleIdsResponse vehicles = await response.Content.ReadAsAsync <VehicleIdsResponse>(); return(vehicles.vehicleIds); }
public static async Task <VehicleIdsResponse> GetVehicleIdsAsync(string dataSetId) { HttpResponseMessage response = await client.GetAsync(client.BaseAddress.AbsoluteUri + string.Format("/api/{0}/vehicles", dataSetId)); VehicleIdsResponse vehicleIds = null; if (response.IsSuccessStatusCode) { vehicleIds = await response.Content.ReadAsAsync <VehicleIdsResponse>(); } else { throw new Exception(string.Format("Unabled to retrieve data vehicle ids.\n\n{0}", response.ReasonPhrase)); } return(vehicleIds); }
private async Task CreateVehicleTasksAsync(string datasetId, VehicleIdsResponse responseVehicleIds) { List <Task <VehicleResponse> > vTaskList = new List <Task <VehicleResponse> >(); foreach (int id in responseVehicleIds.VehicleIds) { Task <VehicleResponse> vResponse = ProcessURLVehicleAsync(datasetId, (int)id); vTaskList.Add(vResponse); } // Await each task. for (int i = 0; i < vTaskList.Count; i++) { VehicleResponse vr = await vTaskList[i]; vehicleList.Add(vr); } }
static async Task RunAsync() { try { VAutoClient.Initialize(); Console.WriteLine("Retreiving data set id..."); DatasetIdResponse datasetIdResponse = await VAutoClient.GetDataSetIdAsync(); string dataSetId = datasetIdResponse.datasetId; Console.WriteLine("Done."); Console.WriteLine("Retreiving vehicle ids..."); VehicleIdsResponse vehicleIds = await VAutoClient.GetVehicleIdsAsync(dataSetId); Console.WriteLine("Done."); Console.WriteLine("Purging vehicle id duplicates..."); IEnumerable <int> vehicleIdList = vehicleIds.vehicleIds.Distinct(); //ensure duplicate calls for vehicle data are not performed. Console.WriteLine("Done."); Console.WriteLine("Retreiving vehicle and dealer data..."); List <Task <VehicleResponse> > vehicleDataTasks = new List <Task <VehicleResponse> >(); List <Task <DealersResponse> > dealerDataTasks = new List <Task <DealersResponse> >(); await GetVehicleAndDealerData(dataSetId, vehicleIdList, vehicleDataTasks, dealerDataTasks); Console.WriteLine("Done."); Console.WriteLine("Building answer..."); Answer answer = BuildAnswer(dealerDataTasks, vehicleDataTasks); Console.WriteLine("Done."); Console.WriteLine("Posting answer..."); AnswerResponse answerResponse = await VAutoClient.PostAnswer(dataSetId, answer); Console.WriteLine("Done."); Console.WriteLine("Result: {0}\nMessage: {1}\nMilliseconds: {2}", answerResponse.success, answerResponse.message, answerResponse.totalMilliseconds); } catch (Exception e) { Console.WriteLine("\n\nException: {0}\n\nStackTrace: {1}", e.Message, e.StackTrace); } }
public AnswerResponse VehiclePostAnswerTest() { dsInstance = new DataSetApi(); vehicleInstance = new VehiclesApi(); dealerInstance = new DealersApi(); Answer answer = new Answer(); // Get DataSet ID string datasetId = ""; DatasetIdResponse responseDataSetId = dsInstance.DataSetGetDataSetId(); datasetId = responseDataSetId.DatasetId; // Get the Dealers and Vehicles for the given DataSetID // Get VehicleIds VehicleIdsResponse responseVehicleIds = new VehicleIdsResponse(); responseVehicleIds = vehicleInstance.VehiclesGetIds(datasetId); ///////////////////////// CHEAT ///////////////////////////////////////////////// answer = dsInstance.DataSetGetCheat(datasetId); //// CHEAT answer ///////////////////////////////////////////////////////////////////////////////// // Post the response answer //var response = dsInstance.DataSetPostAnswer(datasetId, answer); AnswerResponse ansResponse = dsInstance.DataSetPostAnswer(datasetId, answer); Assert.IsInstanceOf <AnswerResponse>(ansResponse, "response is AnswerResponse"); return(ansResponse); }
private async void startButton_Click(object sender, RoutedEventArgs e) { resultsTextBox.Clear(); vehicleList.Clear(); dealerList.Clear(); dsInstance = new DataSetApi(); vehicleInstance = new VehiclesApi(); dealerInstance = new DealersApi(); Answer answer = new Answer(); // Get DataSet ID string datasetId = ""; DatasetIdResponse responseDataSetId = dsInstance.DataSetGetDataSetId(); datasetId = responseDataSetId.DatasetId; // Get the Dealers and Vehicles for the given DataSetID // Get VehicleIds VehicleIdsResponse responseVehicleIds = new VehicleIdsResponse(); responseVehicleIds = vehicleInstance.VehiclesGetIds(datasetId); //Get Vechicle details for each VehicleId VehicleResponse responseVehicle = new VehicleResponse(); await CreateVehicleTasksAsync(datasetId, responseVehicleIds); // For the vehicles, get the dealers var Ids = vehicleList.Select(v => (int)v.DealerId).ToList().Distinct(); List <int> dealerIds = Ids.ToList(); await CreateDealerTasksAsync(datasetId, dealerIds); // Once Vehicle list and Dealer list are done, build the answer List <DealerAnswer> dealerAnswers = new List <DealerAnswer>(); foreach (DealersResponse dealer in dealerList) { DealerAnswer dealerAnswer = new DealerAnswer(); dealerAnswer.DealerId = dealer.DealerId; dealerAnswer.Name = dealer.Name; List <VehicleAnswer> dealerVehicles = new List <VehicleAnswer>(); List <VehicleResponse> vehicles = vehicleList.Where(v => v.DealerId == dealer.DealerId).ToList(); foreach (VehicleResponse res in vehicles) { VehicleAnswer vehicle = new VehicleAnswer(); vehicle.VehicleId = res.VehicleId; vehicle.Make = res.Make; vehicle.Model = res.Model; vehicle.Year = res.Year; dealerVehicles.Add(vehicle); } dealerAnswer.Vehicles = dealerVehicles; dealerAnswers.Add(dealerAnswer); } answer.Dealers = dealerAnswers; // Post the response answer AnswerResponse ansResponse = dsInstance.DataSetPostAnswer(datasetId, answer); string results = ansResponse.Message + "\r\n\r\n" + ansResponse.Success + "\r\n\r\nTime(seconds): " + ansResponse.TotalMilliseconds / 1000.00; foreach (DealerAnswer d in answer.Dealers) { results += "\r\n\r\n----------------------------------------------------------------\r\n\r\n" + d.Name; results += "\r\n\r\n-------------------------"; foreach (VehicleAnswer v in d.Vehicles) { //results += "\r\n\r\n"; results += "\r\n\r\n" + v.Make + " " + v.Model + " " + v.Year; } } resultsTextBox.Text = results; }