Де я позначаю лямбда-вираз асинхронією?


215

У мене цей код:

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

... на що інспекція Решарпера скаржилася на: " Оскільки цього дзвінка не чекають, виконання поточного методу триває до завершення виклику. Подумайте про застосування оператора" очікувати "до результату виклику " (у рядку з коментар).

І отже, я передчував "очікування" на це, але, звичайно, мені теж потрібно десь додати "асинхронізацію" - але куди?



1
@samsara: Приємно, мені цікаво, коли вони нарешті задокументували, що десь поза специфікацією C #. IIRC, жодної документації не було на момент запитання.
BoltClock

Відповіді:


365

Щоб позначити лямбда-асинхронію, просто додайте asyncперед її списком аргументів:

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

Я отримую помилку від Visual Studio про те, що методи анулювання Async не підтримуються.
Кевін Бертон

@Kevin Burton: Так, асинхронні порожнечі, як правило, обмежуються лише обробниками подій. API, який ви використовуєте, або не є асинхронізованим, або має асинхронну версію, яка очікує лямбда завдання асинхронізації.
BoltClock

22

А для тих, хто використовує анонімний вираз:

await Task.Run(async () =>
{
   SQLLiteUtils slu = new SQLiteUtils();
   await slu.DeleteGroupAsync(groupname);
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.