private void GetItemsLocalesAsync(IEnumerable <WowApiLocalizedData> items) { CultureInfo culture = Settings.LocalizationCulture; var apiKey = Services.ViewModels.SettingsViewModel.GetBattleNetApiKey(); IDataProvider provider = DataProviderManager.GetHttpCachedProvider(); var grabber = new WowApiClient(provider, culture, apiKey); Type dataType = SelectedDataType.DataType; int batchSize = 50; // for query throttling, this is the number of items per second we allow to be processed TimeSpan throttle = TimeSpan.FromMilliseconds(1000d / batchSize); Observable.Start(() => { var unprocessed = items.Where(o => o.Status == LocalizationStatus.Unprocessed); while (unprocessed.Any()) { var item = unprocessed.First(); try { item.Query = grabber.GetUrl(dataType, item.ItemId); item.Data = provider.ProvideData(item.Query); } catch (Exception ex) { // if we got an error, keep it to investigate item.Error = ex.Message; break; // stop processing if any error } System.Threading.Thread.Sleep((int)throttle.TotalMilliseconds); } }); }
private void GetItemsLocalesAsync(IEnumerable <LocalizedItem> items) { CultureInfo culture = Settings.LocalizationCulture; IDataProvider provider = DataProviderManager.GetHttpCachedProvider(); var grabber = new WowheadClient(provider, culture); Observable.Start(() => Parallel.ForEach(items, item => { try { // update translated item item.TranslatedEntity = grabber.GetItem(item.DatabaseEntity.Id); item.Error = null; } catch (Exception ex) { // if we got an error, keep it to investigate item.Error = ex.Message; } })); }
private void GetItemsLocalesAsync(IEnumerable <LocalizedItem> items, LocalizationSource localizationSource) { CultureInfo culture = Settings.LocalizationCulture; IDataProvider provider = DataProviderManager.GetHttpCachedProvider(); Func <int, dbItem> grabItem = null; object grabber; if (localizationSource == LocalizationSource.Wowhead) { grabber = new WowheadApi.WowheadClient(provider, culture); grabItem = (id) => { var data = ((WowheadApi.WowheadClient)grabber).GetItem(id); var item = new dbItem { Id = id }; if (data != null) { item.Name = data.Name; if (string.IsNullOrEmpty(data.Description) == false) { item.Description = data.Description; } } return(item); }; } else if (localizationSource == LocalizationSource.BattleNet) { var apiKey = Services.ViewModels.SettingsViewModel.GetBattleNetApiKey(); grabber = new WowApi.WowApiClient(provider, culture, apiKey); grabItem = (id) => { var data = ((WowApi.WowApiClient)grabber).GetItem(id); var item = new dbItem { Id = id }; if (data != null) { item.Name = data.Name; if (string.IsNullOrEmpty(data.Description) == false) { item.Description = data.Description; } } return(item); }; } Parallel.ForEach(items, item => item.ResetStatus()); Observable.Start(() => Parallel.ForEach(items, item => { try { // update translated item item.TranslatedEntity = grabItem(item.DatabaseEntity.Id); item.Error = null; } catch (Exception ex) { // if we got an error, keep it to investigate item.Error = ex.Message; } })); }