如何在WinRT的应用程序ViewModel中异步使用json.net?

时间:2014-08-13 12:17:07

标签: c# serialization mvvm windows-runtime json.net

我有MVVM(Prism)Windows应用商店应用,我不明白如何使用ViewModel层中的Json.NET库(版本6.0.4)进行异步序列化/反序列化。

我有一个绑定到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:0x8001010E(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();
        }
    }

有人可以解释一下,如何正确地进行序列化/反序列化?

1 个答案:

答案 0 :(得分:3)

通常,序列化足够快,您可以直接执行它而不会弄乱后台线程:

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