web-dev-qa-db-fra.com

Où puis-je marquer une expression lambda async?

J'ai ce code:

private async void ContextMenuForGroupRightTapped(object sender, RightTappedRoutedEventArgs args)
{
    CheckBox ckbx = null;
    if (sender is CheckBox)
    {
        ckbx = sender as CheckBox;
    }
    if (null == ckbx)
    {
        return;
    }
    string groupName = ckbx.Content.ToString();

    var contextMenu = new PopupMenu();

    // Add a command to edit the current Group
    contextMenu.Commands.Add(new UICommand("Edit this Group", (contextMenuCmd) =>
    {
        Frame.Navigate(typeof(LocationGroupCreator), groupName);
    }));

    // Add a command to delete the current Group
    contextMenu.Commands.Add(new UICommand("Delete this Group", (contextMenuCmd) =>
    {
        SQLiteUtils slu = new SQLiteUtils();
        slu.DeleteGroupAsync(groupName); // this line raises Resharper's hackles, but appending await raises err msg. Where should the "async" be?
    }));

    // Show the context menu at the position the image was right-clicked
    await contextMenu.ShowAsync(args.GetPosition(this));
}

... que l'inspection de Resharper s'est plaint avec, "Puisque cet appel n'est pas attendu, l'exécution de la méthode en cours continue avant que l'appel soit terminé. Envisagez d'appliquer l'opérateur 'wait' au résultat de l'appel "(sur la ligne avec le commentaire).

Et donc, j'ai préparé une "attente", mais bien sûr, je dois ensuite ajouter un "asynchrone" quelque part aussi - mais où?

195
B. Clay Shannon

Pour marquer un lynda asynchrone, ajoutez simplement async avant sa liste d'arguments:

// Add a command to delete the current Group
contextMenu.Commands.Add(new UICommand("Delete this Group", async (contextMenuCmd) =>
{
    SQLiteUtils slu = new SQLiteUtils();
    await slu.DeleteGroupAsync(groupName);
}));
327
BoltClock

Et pour ceux qui utilisent une expression anonyme:

await Task.Run(async () =>
{
   SQLLiteUtils slu = new SQLiteUtils();
   await slu.DeleteGroupAsync(groupname);
});
10
Su Llewellyn