如何在WinRT's应用ViewModel中异步使用json.net
本文关键字:异步 ViewModel net json 应用 WinRT | 更新日期: 2023-09-27 18:18:00
我有MVVM(Prism) Windows Store应用程序,我不明白如何使用Json进行异步序列化/反序列化。. NET库(Version 6.0.4)在ViewModel层。
我有一个方法,它被绑定到GridView的ItemClick事件:
public async void GridViewClick(object sender, ItemClickEventArgs parameter)
{
if (App.IsInternet())
{
if (parameter != null)
_navigationService.Navigate("AnimeDetails",
await Task.Run(() => JsonConvert.SerializeObject(parameter.ClickedItem)));
}
else
{
new MessageDialog(ResourceController.GetTranslation("MainPage_FeatureUnavaliableOffline")).ShowAsync();
}
}
这个方法抛出以下异常:
应用程序调用了为不同线程编组的接口。(ИсключениеизHRESULT: 0 x8001010e (RPC_E_WRONG_THREAD))
我尝试使用Dispatcher,但它没有帮助我(类似的错误线程异常)。
public async void GridViewClick(object sender, ItemClickEventArgs parameter)
{
if (App.IsInternet())
{
var serializedItem = string.Empty;
await
Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
async () =>
await Task.Run(() => serializedItem = JsonConvert.SerializeObject(parameter.ClickedItem)));
if (parameter != null)
_navigationService.Navigate("AnimeDetails", serializedItem);
}
else
{
new MessageDialog(ResourceController.GetTranslation("MainPage_FeatureUnavaliableOffline")).ShowAsync();
}
}
谁能给我解释一下,如何正确地进行序列化/反序列化?
通常,序列化是足够快的,你可以直接做它,而不干扰后台线程:
if (parameter != null)
_navigationService.Navigate("AnimeDetails",
JsonConvert.SerializeObject(parameter.ClickedItem));
然而,如果你的对象真的很大,你确定你想使用后台线程,那么你只需要在UI线程上做任何UI访问(例如,ItemClickEventArgs.ClickedItem
)和后台线程上的序列化:
if (parameter != null)
{
var item = parameter.ClickedItem;
_navigationService.Navigate("AnimeDetails",
await Task.Run(() => JsonConvert.SerializeObject(item)));
}