我有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();
}
}
有人可以解释一下,如何正确地进行序列化/反序列化?
答案 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)));
}