【发布时间】:2014-05-26 13:07:26
【问题描述】:
我有一个 ViewModel,它以同步方法实例化一个事件。该事件向 UI 发出信号,我们需要用户回答“是”或“否”,然后才能继续。
我正在尝试显示MessageDialog 并等到用户提供答案 - 是或否。我很难做到这一点。我目前在尝试执行此操作时收到UnauthorizedAccessException。
下面是 UI 中的代码:
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;
}
我试过了:
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 线程会锁定。
MessageDialog md = new MessageDialog(question);
md.Commands.Add(new UICommand("Yes", CommandInvokedHandler));
md.Commands.Add(new UICommand("No", CommandInvokedHandler));
await md.ShowAsync();
如果MessageDialog 有一个同步版本的Show() 我会很好,但是MessageDialog 的异步行为加上我的同步例程加上跨线程让我感到困惑。我想知道是否有人可以概述在我的后端 ViewModel 中继续同步方法之前,我需要做什么来等待 MessageDialog 上的用户输入。
提前感谢您的帮助。
【问题讨论】:
标签: c# microsoft-metro async-await messagedialog