2012-11-20 7 views
0

webservice에 대한 많은 호출로 메트로 애플리케이션을 작성 중입니다. 때때로 웹 서비스가 약간 느립니다. 그리고 내 데이터가 다운로드 될 때까지 페이지 내에서 기다리는 것을 원하지 않습니다.메트로 앱, 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을 사용하여 취소 토큰을 사용할 수 있습니다. 그리고 Dispatcher.RunAsync는 UI를 고정시키지 않아야합니다. 이것은 LoadState 페이지 내에서 사용됩니다.

어떻게이 문제를 해결할 수 있습니까?

감사합니다.

(내 문제가 해결되지 않음)로 업데이트 :

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

경우이 코드가 나타나지 않습니다 귀하의 경우

, 당신은이 작업을 수행 할 수 있어야한다? 'AsTask' 호출에서 취소 토큰을 지정할 수 있다면'Task.Run'이 필요 없다고 생각합니다. –

+0

@JonSkeet 페이지로드 중 표시됩니다. – David

+0

그러면 웹 서비스 호출이 완료 될 때까지 페이지로드를 완료하지 않습니다. 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'을 취할 수 있습니다. –

관련 문제