2013-06-24 2 views
2

동기 메서드에서 이벤트를 인스턴스화하는 ViewModel이 있습니다. 이 이벤트는 계속 진행하기 전에 UI에서 "예"또는 "아니요"대답이 필요하다는 신호를 UI에 전달합니다.MessageDialog - 사용자 입력 대기 필요

MessageDialog을 표시하고 사용자가 대답을 제공 할 때까지 기다리려고합니다. 예 또는 아니오.이 작업을 수행하는 데 어려움이 있습니다. 나는 이것을 시도 할 때 현재 UnauthorizedAccessException을 얻는다. 내가 시도

async Task<bool> Instance_SwitchConfirmation(string question) 
{ 
    MessageDialog md = new MessageDialog(question); 
    md.Commands.Add(new UICommand("Yes", CommandInvokedHandler)); 
    md.Commands.Add(new UICommand("No", CommandInvokedHandler)); 
    md.ShowAsync(); 

    return this.canSwitch; 
} 

async void CommandInvokedHandler(IUICommand command) 
{ 
    this.canSwitch = command.Label == "Yes" ? true : false; 
} 

:

는 여기 UI의 코드를 살펴입니다

var uiContext = TaskScheduler.FromCurrentSynchronizationContext(); 
Task.Factory.StartNew(() => { 
    MessageDialog md = new MessageDialog(question); 
    md.Commands.Add(new UICommand("Yes", CommandInvokedHandler)); 
    md.Commands.Add(new UICommand("No", CommandInvokedHandler)); 
    md.ShowAsync(); 
}, 
new System.Threading.CancellationToken(), 
TaskCreationOptions.PreferFairness, uiContext); 

하지만이 같은 예외와 함께 실패합니다.

마지막으로 MessageDialog를 기다리는 것처럼 대화 상자가 표시되지 않고 UI 스레드가 잠 깁니다. MessageDialogShow()의 동기 버전을했다

MessageDialog md = new MessageDialog(question); 
md.Commands.Add(new UICommand("Yes", CommandInvokedHandler)); 
md.Commands.Add(new UICommand("No", CommandInvokedHandler)); 
await md.ShowAsync(); 

하면 괜찮을 것입니다하지만 크로스 스레딩과 함께 내 synchrounous 일상과 함께 MessageDialog의 asynchrnous behvaior은, 저를 혼동한다. 내 백엔드 ViewModel에서 동기 메서드를 계속하기 전에 누군가가 MessageDialog에 사용자 입력을 기다릴 필요가 무엇인지를 설명 할 수 있는지 궁금합니다.

도움을 미리 감사드립니다.

답변

7

Win8 C# Metro dispatcher and RPC_E_WRONG_THREADCoreDispatcher.RunAsync을 참조하십시오.

Dispatcher에서 메소드가 실행되지 않으므로 코드를 수동으로 호출해야합니다. 콜백 패턴으로의 리팩토링을 피하기 위해 결과를 설정하기 위해 TaskCompletionSource(T)을 사용할 수 있으며 결과가 설정된 후에 백그라운드 스레드가 계속됩니다.

+0

응답 해 주셔서 감사합니다.하지만 코드 입력을 계속하기 전에 사용자 입력을 기다려야합니다. Dispather.RunAsync 호출을 기다리는 경우 MessageDialog가 표시되지 않고 UI 스레드가 잠 깁니다. 어떤 제안? 미리 감사드립니다. – user2334154

+0

콜백이 원인 일 수 있습니다. 내 편집을 시도하십시오. – Romoku

+0

빠른 응답을 보내 주셔서 다시 한 번 감사드립니다. 불행히도, 이것은 여전히 ​​기다리고 있지 않습니다. 나는 돌아갈 수 있습니다. 문이 호출 후 MessageDialog를 표시하기 전에 호출되고 Dispatcher.RunAsync 호출을 기다리는 경우 다시 UI 스레드가 잠겼습니다. 다른 생각? – user2334154