Bir lambda ifadesini zaman uyumsuzluğunu nerede işaretleyebilirim?


215

Bu kodu aldım:

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

... ReSharper'ın muayene ile şikayetçi olduğunu " bu çağrı beklenen olmadığı için çağrı tamamlanmadan önce, şimdiki yöntemin yürütülmesine devam ediyor. çağrının sonucuna 'bekliyoruz' operatörü uygulayarak düşünün ile on line (" yorum Yap).

Ve böylece, ona bir "beklemeyi" önermiştim, ama, tabii ki, o zaman bir yere de bir "asenkron" eklemem gerekiyor - ama nerede?



1
@samsara: Güzel, nihayet C # spec dışında bir yerde belgelediğini merak ediyorum. IIRC'de, bu soru sorulduğu sırada hiçbir belge mevcut değildi.
BoltClock

Yanıtlar:


365

Bir lambda zaman uyumsuzluğunu işaretlemek için asyncbağımsız değişken listesinden önce başlamanız yeterlidir :

// 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'dan Async geçersiz yöntemlerini desteklemediğini belirten bir hata alıyorum.
Kevin Burton

@Kevin Burton: Evet, asenkron boşluklar genellikle yalnızca olay işleyicileriyle sınırlıdır. Kullandığınız API ya zaman uyumsuz değil ya da zaman uyumsuz bir Görev lambda bekleyen bir zaman uyumsuz sürümüne sahip.
BoltClock

22

Ve anonim bir ifade kullananlarınız için:

await Task.Run(async () =>
{
   SQLLiteUtils slu = new SQLiteUtils();
   await slu.DeleteGroupAsync(groupname);
});
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.