Tôi đánh dấu biểu thức lambda không đồng bộ ở đâu?


215

Tôi đã có mã này:

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

... rằng kiểm tra của Resharper đã phàn nàn về " Vì cuộc gọi này không được chờ đợi, nên việc thực hiện phương thức hiện tại vẫn tiếp tục trước khi cuộc gọi kết thúc. Hãy xem xét áp dụng toán tử 'await' cho kết quả của cuộc gọi " (trên đường dây với bình luận).

Và vì vậy, tôi đã chuẩn bị một "sự chờ đợi" cho nó, nhưng, tất nhiên, sau đó tôi cũng cần thêm một "async" ở đâu đó - nhưng ở đâu?



1
@samsara: Nice, tôi tự hỏi khi cuối cùng họ đã ghi lại rằng ở đâu đó bên ngoài thông số C #. IIRC, không có tài liệu nào tồn tại vào thời điểm câu hỏi này được hỏi.
BoltClock

Câu trả lời:


365

Để đánh dấu đồng bộ lambda, chỉ cần thêm asynctrước danh sách đối số của nó:

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

Tôi gặp lỗi từ Visual Studio mà các phương thức void Async không được hỗ trợ.
Kevin Burton

@Kevin Burton: Vâng, các khoảng trống async thường chỉ giới hạn cho các trình xử lý sự kiện. API bạn đang sử dụng không phải là không đồng bộ hoặc có phiên bản async mong đợi một lambda Nhiệm vụ không đồng bộ thay thế.
BoltClock

22

Và đối với những bạn sử dụng một biểu thức ẩn danh:

await Task.Run(async () =>
{
   SQLLiteUtils slu = new SQLiteUtils();
   await slu.DeleteGroupAsync(groupname);
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.