2012-11-20 20 views
0

我正在寫一個大量調用webservice的地鐵應用程序。 有時Web服務有點慢。我不想在一個頁面內等待,直到我的數據被下載。地鐵應用程序,不要凍結UI

但是,我的後退按鈕被禁用,直到我的數據已被加載。 這是一個大問題。

所以我試着用:

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應該允許我不凍結我的用戶界面。 這在頁面LoadState中使用。

我該如何解決這個問題?

問候。

更新了(沒有解決我的問題):

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

如果這段代碼出現?我懷疑你還是不需要'Task.Run',因爲你可以在'AsTask'調用中指定取消標記。 –

+0

@JonSkeet在頁面加載狀態下顯示。 – David

+0

那麼你就在那裏 - 直到Web服務調用完成後才能完成頁面加載。即使你沒有製作UI線程塊,我懷疑顯示的後退按鈕與頁面加載完成有關。 –

回答

0

你不能只是把Task.RunDispatcher.RunAsync你的問題。你需要了解他們做什麼。

在你的情況,你應該能夠只是這樣做:

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

謝謝,但它不能解決我的問題,我希望它在UI之外的另一個線程中(以提高性能)。而且我還想使用任務來取消它。 – David

+0

如果'InitAsync'是一個正確寫入的異步方法,那麼您將不會通過在另一個線程中運行來提高性能。你可以修改'InitAsync'來取消'CancellationToken'。 –