Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在反序列化大JSON文件时显示具有不确定进度环的消息框?_C#_Json_Mvvm_Uwp_Async Await - Fatal编程技术网

C# 如何在反序列化大JSON文件时显示具有不确定进度环的消息框?

C# 如何在反序列化大JSON文件时显示具有不确定进度环的消息框?,c#,json,mvvm,uwp,async-await,C#,Json,Mvvm,Uwp,Async Await,我有一个运行mvvm模式的小型uwp应用程序,它需要在执行过程中的某个时刻加载一个大的JSON文件。我想打印一个带有不确定进度环控件的消息框,直到反序列化完成。 我想异步等待JsonConvert.DeserializeObject的结果,同时打印消息框。 大概是这样的: MyClass反序列化(字符串文本、JsonSerializerSettings设置) { MyClass结果=JsonConvert.DeserializeObject(文本、设置); } 专用异步void加载Screena

我有一个运行mvvm模式的小型uwp应用程序,它需要在执行过程中的某个时刻加载一个大的JSON文件。我想打印一个带有不确定进度环控件的消息框,直到反序列化完成。 我想异步等待
JsonConvert.DeserializeObject
的结果,同时打印消息框。 大概是这样的:

MyClass反序列化(字符串文本、JsonSerializerSettings设置)
{
MyClass结果=JsonConvert.DeserializeObject(文本、设置);
}
专用异步void加载ScreenaSync()
{
var dialog=new MessageDialogWithFancySpinningRing();//但实际上我不知道怎么做;)
wait dialog.ShowAsync();
}
var deserializeTask=反序列化(MyText,MySettings);
Var LoadingScreenTask=LoadingScreenAsync();
MyClass结果=等待反序列化任务;
wait dialog.ShowAsync();
// ... 继续结果
尽管我还没有尝试过,因为从我所读到的内容来看,我认为它不起作用,因为
反序列化
jsonvert.DeserializeObject
不是异步方法。我需要在另一个线程上运行反序列化,对于这样一个简单的事情来说,这看起来很麻烦

有什么想法吗

如何在反序列化大JSON文件时显示具有不确定进度环的消息框

首先,需要在非UI线程中调用
反序列化
方法,然后在
反序列化
完成后调用dialog
Hide

反序列化
是一项耗时的操作。请在任务中运行它,并在方法头部添加等待关键字。有关更多信息,请参考以下代码

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();
}
private ContentDialog noWifiDialog;
私有异步void DisplayNoWifiDialog()
{
noWifiDialog=newcontentdialog()
{
Title=“反序列化Json”,
Content=newprogressring(){Name=“myproress”,IsActive=true},
CloseButtonText=“确定”
};
wait noWifiDialog.ShowAsync();
}
私有任务反序列化()
{
返回任务。运行(()=>
{
对于(int i=0;i<100000000;i++)
{
//模拟耗时操作
}
});
}
专用异步无效按钮\u单击(对象发送方,路由目标)
{
DisplayNoWifiDialog();
等待反序列化();
noWifiDialog.Hide();
}

只是一个想法。为什么不尝试等待游标,直到Json被反序列化,而不是消息框呢。在运行Json Convert时,我从未尝试过使用progress ring的MessageBox。这是一个很好的解决方案,尽管我想解释一下MessageBox中的内容,并允许用户选择应用程序下一步要做什么的设置(有点像某些安装程序),但我发现了一些有趣的东西。请检查谢谢我感谢你的研究尽管Backgroundworker有点像async/await的祖先,而且据我所知更像winform。这不是你真正的代码,也不会编译,所有这些东西是什么异步void不会返回任务