web-dev-qa-db-ja.com

「await」演算子は、非同期ラムダ式内でのみ使用できます

C#Windowsストアアプリを持っています。別のMessageDialog内のコマンドボタンの1つがクリックされたときに、MessageDialogを起動しようとしています。これのポイントは、コンテンツが保存されていないことをユーザーに警告することです。キャンセルをクリックすると、別の保存ダイアログを使用して保存するように求められます。

これが私の「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では、コンパイラエラーが発生します:

'await'演算子は、非同期ラムダ式内でのみ使用できます。このラムダ式を「async」修飾子でマークすることを検討してください

メソッドはawaitでマークされます。 showSaveDialogの前からawaitを削除すると、コンパイル(および動作)しますが、本当にawaitを使用する必要があるという警告が表示されます。

このコンテキストでawaitを使用するにはどうすればよいですか?

49
roryok

次のように、ラムダ式をasyncとしてマークする必要があります。

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