public Task UpdateMappingDataTask() { return(new Task(() => { RefreshTimer.Stop(); OnUpdate?.Invoke(); JsonTextReader jReader; using (var client = new WebClient()) { var data = Encoding.UTF8.GetString(client.DownloadData(Properties.Settings.Default.VersionJsonUrl)); jReader = new JsonTextReader(new StringReader(data)); } MappingData.Clear(); VersionJson jsonInput = VersionJson.Init; string keyVersion = null; MappingType keyMapType = MappingType.Snapshot; while (jReader.Read()) { var value = jReader.Value; if (jReader.Value != null) { switch (jsonInput) { case VersionJson.MCVersion: MappingData[keyVersion = (string)value] = new Dictionary <MappingType, SortedSet <int> >(); break; case VersionJson.MapType: if (!Enum.TryParse((string)value, true, out keyMapType)) { throw new InvalidDataException("Expected Mapping type."); } break; case VersionJson.Version: if (!MappingData[keyVersion].ContainsKey(keyMapType)) { MappingData[keyVersion][keyMapType] = new SortedSet <int>(); } MappingData[keyVersion][keyMapType].Add((int)(long)value); break; default: break; } } else { if (jReader.TokenType == JsonToken.StartObject) { jsonInput += 1; } else if (jReader.TokenType == JsonToken.StartArray) { jsonInput += 1; } else if (jReader.TokenType == JsonToken.EndObject) { jsonInput -= 1; } else if (jReader.TokenType == JsonToken.EndArray) { jsonInput -= 1; } } } Dispatcher.Invoke(() => { var versions = new List <string>(MappingData.Keys); versions.Sort(MCVersionComparer.Comparer); versions.Reverse(); versions.Insert(0, "Semi-Live"); versions.Add("Custom"); MCVersionDropDown.ItemsSource = versions; }); RefreshTimer.Start(); OnUpdateFinished?.Invoke(); IsUpdating = false; })); }