如何在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();
        }
    }

谁能给我解释一下,如何正确地进行序列化/反序列化?

如何在WinRT's应用ViewModel中异步使用json.net

通常,序列化是足够快的,你可以直接做它,而不干扰后台线程:

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)));
}