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