public void UdpateCardInstanceDefinitionsAsync() { if (UpdateCardInstanceDefinitionsBGW.IsBusy) { throw new Exception("Can't call to UpdateCardInstanceDefinitionsBGW until the previous execution finishes"); } var argument = new UpdateCardInstanceDefinitionsArgument(ApiManagerInstance, InMemoryManagerInstance); UpdateCardInstanceDefinitionsBGW.RunWorkerAsync(argument); }
private static void UpdateCardInstanceDefinitions_DoWork(object sender, DoWorkEventArgs e) { BackgroundWorker worker = (BackgroundWorker)sender; UpdateCardInstanceDefinitionsArgument managers = (UpdateCardInstanceDefinitionsArgument)e.Argument; worker.ReportProgress(0); var getCardsFromCollectionPageCall = new ApiCallList.Collections.GetCollectionPage { nbPerPage = 52, // Maximum allowed by the API ItemsFilter = new List <string>() { "id", "id_player_character", "level", "xp" }, ContextFilter = new List <string>() { "totalPages" } }; var request = new ApiRequest(); request.EnqueueApiCall(getCardsFromCollectionPageCall); int page = 0; int totalPages = 1; // First valid page = 0. Last valid page = totalPages - 1 bool firstIteration = true; var instances = new List <CardInstance>(); while (page < totalPages) { if (worker.CancellationPending == true) { e.Cancel = true; return; } getCardsFromCollectionPageCall.page = page; string response; HttpStatusCode statusCode = managers.ApiManager.SendRequest(request, out response); if (statusCode != HttpStatusCode.OK) { throw new Exception("GetCardInstancesFromSummary returned: " + statusCode.ToString()); } dynamic decoded = JsonDecoder.Decode(response); if (firstIteration) { dynamic context = decoded[getCardsFromCollectionPageCall.Call]["context"]; totalPages = int.Parse(context["totalPages"].ToString()); getCardsFromCollectionPageCall.ContextFilter.Remove("totalPages"); firstIteration = false; } worker.ReportProgress(100 * page / totalPages); // totalPages can't be zero, a player can't sell cards on their current deck dynamic items = decoded[getCardsFromCollectionPageCall.Call]["items"]; foreach (dynamic item in items) { int cardBaseId = int.Parse(item["id"].ToString()); int cardInstanceId = int.Parse(item["id_player_character"].ToString()); int level = int.Parse(item["level"].ToString()); int experience = int.Parse(item["xp"].ToString()); instances.Add(new CardInstance(managers.InMemoryManager.GetCardBase(cardBaseId), cardInstanceId, level, experience)); } page++; } managers.InMemoryManager.ReloadToMemoryCardInstances(instances); worker.ReportProgress(100); }