C# 地铁应用程序,don';t冻结用户界面

C# 地铁应用程序,don';t冻结用户界面,c#,microsoft-metro,winrt-async,C#,Microsoft Metro,Winrt Async,我正在编写一个metro应用程序,其中包含大量对webservice的调用。 有时web服务有点慢。我不想在页面内等待数据下载 但是,在加载数据之前,我的后退按钮处于禁用状态。 这是一个大问题 所以我试着: try { await Task.Run(() => { Dispatcher.RunAsync(CoreDispatcherPriority.High,

我正在编写一个metro应用程序,其中包含大量对webservice的调用。 有时web服务有点慢。我不想在页面内等待数据下载

但是,在加载数据之前,我的后退按钮处于禁用状态。 这是一个大问题

所以我试着:

 try
{
    await Task.Run(() =>
                       {
                           Dispatcher.RunAsync(CoreDispatcherPriority.High, 
                           () => ViewModel.InitAsync(date)).AsTask(_cts.Token);
                       }, _cts.Token);
}catch(Exception e)
{
    Debug.WriteLine("HomePage, LoadState : "+e);
}

我使用Task.Run来使用cancellationtoken。 Dispatcher.RunAsync应该允许我不冻结我的UI。 这在页面加载状态中使用

如何解决此问题

问候

更新为(不解决我的问题):


您不能在遇到问题时抛出
Task.Run
Dispatcher.RunAsync
。你需要了解他们在做什么

在您的情况下,您应该能够做到这一点:

try
{
  await ViewModel.InitAsync(date);
}
catch (Exception e)
{
  Debug.WriteLine("HomePage, LoadState : " + e);
}

这个代码出现在哪里?我怀疑您仍然不需要
任务。请运行
,因为您可以在
AsTask
调用中指定取消令牌。@jonsket它在页面加载状态下出现。然后,您就可以了-在web服务调用完成之前,您不会完成页面加载。即使您没有创建UI线程块,我也怀疑出现的“后退”按钮与页面加载完成有关。@JonSkeet谢谢,我试图在加载的事件中添加它(因此在加载页面时应该这样做)。但这并不能解决我的问题。谢谢,但它不能解决我的问题,我希望它位于UI之外的另一个线程中(以提高性能)。我还想使用任务来取消它。如果
InitAsync
是一个正确编写的异步方法,那么在另一个线程中运行它不会提高性能。您可以修改
InitAsync
以获取
CancellationToken
try
{
  await ViewModel.InitAsync(date);
}
catch (Exception e)
{
  Debug.WriteLine("HomePage, LoadState : " + e);
}