Dove segnare un'espressione lambda asincrona?


215

Ho questo codice:

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));
}

... di cui si lamentava l'ispezione di Resharper, " Poiché questa chiamata non è attesa, l'esecuzione del metodo corrente continua prima del completamento della chiamata. Si consiglia di applicare l'operatore" wait "al risultato della chiamata " (sulla linea con il commento).

E così, ho anteposto un "aspetto" ad esso, ma, naturalmente, ho bisogno di aggiungere un "asincrono" anche da qualche parte - ma dove?



1
@samsara: Bello, mi chiedo quando finalmente lo abbiano documentato da qualche parte al di fuori delle specifiche C #. IIRC, non esisteva documentazione al momento in cui è stata posta questa domanda.
BoltClock

Risposte:


365

Per contrassegnare un lambda asincrono, basta anteporre asyncprima del suo elenco di argomenti:

// 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);
}));

Viene visualizzato un errore da Visual Studio che i metodi void Async non sono supportati.
Kevin Burton,

@Kevin Burton: Sì, i vuoti asincroni sono generalmente limitati ai gestori di eventi. L'API che stai utilizzando non è asincrona o ha una versione asincrona che prevede invece un'attività lambda asincrona.
BoltClock

22

E per quelli di voi che usano un'espressione anonima:

await Task.Run(async () =>
{
   SQLLiteUtils slu = new SQLiteUtils();
   await slu.DeleteGroupAsync(groupname);
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.