Как показать окно сообщения с неопределенным кольцом прогресса при десериализации большого файла JSON? - PullRequest
0 голосов
/ 16 мая 2019

У меня есть небольшое приложение uwp, работающее с шаблоном mvvm, которое должно загрузить большой JSON-файл в какой-то момент во время выполнения.Я хочу напечатать окно сообщения с неопределенным управлением кольцом прогресса, пока десериализация не будет завершена.Я думал о том, чтобы дождаться результата JsonConvert.DeserializeObject в асинхронном режиме и тем временем напечатать окно сообщения.Примерно так:

MyClass Deserialize(string text, JsonSerializerSettings settings)
{
    MyClass result = JsonConvert.DeserializeObject<MyClass>(text, settings);
}

private async void LoadingScreenAsync()
{
    var dialog = new MessageDialogWithFancySpinningRing(); // I actually don't know how to do it though ;)
    await dialog.ShowAsync();
}

var deserializeTask = Deserialize(MyText, MySettings);
Var LoadingScreenTask = LoadingScreenAsync();

MyClass Result = await deserializeTask;
await dialog.ShowAsync();

// ... continue with result

Хотя я еще не пробовал, потому что из того, что я прочитал, я подумал, что это не сработает, поскольку Deserialize и JsonConvert.DeserializeObject не являются асинхронными методами,Похоже, мне нужно было бы запустить десериализацию в другом потоке для того, что для такой простой вещи выглядит большим трудом.

Есть идеи?

1 Ответ

1 голос
/ 17 мая 2019

Как показать окно сообщения с неопределенным кольцом прогресса при десериализации большого файла JSON?

Сначала вам нужно вызвать метод Deserialize в потоке, не являющемся пользовательским интерфейсом, затем вам нужно вызвать диалоговое окно Hide после того, как Deserialize закончено.

Deserialize - это трудоемкая операция. пожалуйста, запустите его в Задаче и добавьте ключевое слово await в начало метода. Для получения дополнительной информации вы можете обратиться к следующему коду.

private ContentDialog noWifiDialog;
private async void DisplayNoWifiDialog()
{
    noWifiDialog = new ContentDialog()
    {
        Title = "Deserialize Json ",
        Content = new ProgressRing() { Name = "MyProsress", IsActive = true },
        CloseButtonText = "Ok"
    };

    await noWifiDialog.ShowAsync();
}

private Task Deserialize()
{
    return Task.Run(() =>
    {
        for (int i = 0; i < 1000000000; i++)
        {
         // Simulated time-consuming operation
        }
    });
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
    DisplayNoWifiDialog();
    await Deserialize();
    noWifiDialog.Hide();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...