2013-12-15 142 views
37

我有一个c#Windows Store应用程序。当点击另一个MessageDialog内的命令按钮之一时,我试图启动一个MessageDialog。关键是要警告用户他们的内容未保存,如果他们点击取消,它会提示他们使用单独的保存对话框进行保存。'await'操作符只能在异步lambda表达式中使用

这里是我的 “showCloseDialog” 功能:

private async Task showCloseDialog() 
{ 
    if (b_editedSinceSave) 
    { 
     var messageDialog = new MessageDialog("Unsaved work detected. Close anyway?", "Confirmation Message"); 

     messageDialog.Commands.Add(new UICommand("Yes", (command) => 
     { 
      // close document 
      editor.Document.SetText(TextSetOptions.None, ""); 
     })); 

     messageDialog.Commands.Add(new UICommand("No", (command) => 
     { 
      // save document 
      await showSaveDialog(); 
     })); 

     messageDialog.DefaultCommandIndex = 1; 
     await messageDialog.ShowAsync(); 
    } 
} 

在VS我得到一个编译错误:

The 'await' operator can only be used within an async lambda expression. Consider marking this lambda expression with the 'async' modifier`

方法标有await。如果我从showSaveDialog之前删除await,它编译(和作品),但我得到的,我真的应该使用await

如何在这种情况下使用await一个警告?

+3

拉姆达代表没有被标记为异步'(命令)=>' – Silvermind

+1

作为一个方面说明,如果我得到一个程序,要求我“检测到未保存的工作,仍然关闭?”,然后点击“否”,我预计操作被取消。我不希望程序保存文件,或提供保存文件。对于你之后的行为,问题“检测到未保存的工作,在关闭之前保存?”可能更合适。 – hvd

+0

@ hvd此刻此处仅为占位符文字,但我很欣赏这个建议! – roryok

回答

64

你必须标记你的lambda表达式为async,就像这样:

messageDialog.Commands.Add(new UICommand("No", async (command) => 
{ 
    await showSaveDialog(); 
}));