Di mana saya menandai ekspresi lambda async?

215

Saya mendapat kode ini:

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

... bahwa inspeksi Resharper mengeluhkan dengan, " Karena panggilan ini tidak ditunggu, pelaksanaan metode saat ini berlanjut sebelum panggilan selesai. Pertimbangkan menerapkan operator 'menunggu' ke hasil panggilan " (pada baris dengan komentar).

Jadi, saya menambahkan "menunggu" untuk itu tetapi, tentu saja, saya kemudian perlu menambahkan "async" di suatu tempat juga - tetapi di mana?

B. Clay Shannon
sumber
1
@samsara: Bagus, saya ingin tahu ketika mereka akhirnya mendokumentasikan bahwa di suatu tempat di luar spesifikasi C #. IIRC, tidak ada dokumentasi saat pertanyaan ini diajukan.
BoltClock

Jawaban:

365

Untuk menandai lambda async, cukup tambahkan asyncsebelum daftar argumennya:

// 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);
}));
BoltClock
sumber
Saya mendapatkan kesalahan dari Visual Studio bahwa metode void Async tidak didukung.
Kevin Burton
@ Kevin Burton: Ya, rongga async biasanya hanya terbatas pada penangan acara. API yang Anda gunakan bukan async atau memiliki versi async mengharapkan lambda Tugas async.
BoltClock
22

Dan bagi Anda yang menggunakan ekspresi anonim:

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