“await”操作符只能在异步lambda表达式中使用。

73

我有一个C# Windows商店应用程序。 我试图在另一个MessageDialog的其中一个命令按钮被点击时启动MessageDialog。 这样做的目的是警告用户其内容未保存,如果他们点击取消,它将提示他们使用单独的保存对话框进行保存。

这是我的“showCloseDialog”函数:

private async Task showCloseDialog()
{
  if (b_editedSinceSave)
  {
    var messageDialog = new MessageDialog("Unsaved work! 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 中我得到一个编译错误:

“await”操作符只能在异步 Lambda 表达式中使用。请考虑使用“async”修饰符标记此 Lambda 表达式。

该方法被标记了 await。如果我从 showSaveDialog 前面移除 await,它就可以编译(并工作),但我会收到警告,提示我真的应该使用 await

在这个上下文中,我该如何使用 await


3
Lambda委托没有标记为async (command) => - Silvermind
1
顺便提一下,如果我收到一个询问“检测到未保存的工作。仍然关闭吗?”的程序,并点击“否”,我希望操作被取消。我不期望该程序保存文件或提供保存文件的选项。对于您所需的行为,问题“检测到未保存的工作。在关闭之前保存?”可能更合适。 - user743382
@hvd 目前这只是占位符文本,但我很感谢您的建议! - roryok
2个回答

135

你必须像这样将 lambda 表达式标记为 async

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

1
在我的情况下,我需要在异步 foreach 中调用一个异步方法。解决方案类似于这样:
await list.ForEachAsync(async item =>
{
    IEnumerable<Object> data = await _repository.Get();
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接