web-dev-qa-db-fra.com

L'opérateur 'wait' ne peut être utilisé que dans une expression lambda asynchrone

J'ai une application c # Windows Store. J'essaie de lancer un MessageDialog lorsque l'un des boutons de commande d'un autre MessageDialog est cliqué. Le but de cela est d'avertir l'utilisateur que son contenu n'est pas enregistré, et s'il clique sur annuler, il sera invité à enregistrer à l'aide d'une boîte de dialogue d'enregistrement distinct.

Voici ma fonction "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();
    }
}

Dans VS, j'obtiens une erreur de compilation:

L'opérateur "wait" ne peut être utilisé que dans une expression lambda asynchrone. Pensez à marquer cette expression lambda avec le modificateur "async".

La méthode est marquée par await. Si je supprime await d'avant showSaveDialog, il compile (et fonctionne) mais je reçois un avertissement que je dois vraiment utiliser await

Comment utiliser await dans ce contexte?

49
roryok

Vous devez marquer votre expression lambda comme async, comme ceci:

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