2016-04-09 16 views
0

kendi görevlerini sahip birden TAKS ile WhenAll, ve merak ettim Bu biraz verbose gibi görünüyor ve bunun için daha kısa bir sürüm olup olmadığını merak ediyordum.Görev tüm ı Task.WhenAll için arama yapmak ve her biri kendi alt görevler var Görevler bir dizi beklemek istiyorum

public async Task ChangeNotificationsDispatchTimeAsync(string userId, DateTime utcDateTimeToSend) 
{ 
    IList<TNotificationEntity> notifications = 
     await _notificationsTable.GetRowsByPartitionKeyAndRowKeyAsync(ToTicks(_now), userId, QueryComparisons.GreaterThanOrEqual); 
    await Task.WhenAll(
     notifications.Select(notification => 
     { 
      return new Task(() => 
      { 
       _notificationsTable.DeleteRowAsync(notification.PartitionKey, notification.RowKey); 
       notification.PartitionKey = ToTicks(utcDateTimeToSend); 
       _notificationsTable.InsertRowAsync(notification); 
      }); 
     }));   
} 

cevap

0

Bu görevleri başlatmanız gerekir. Ayrıca, lambalarınızı uyumsuz hale getirebilir ve vücutta bekleyebilirsiniz. (DeleteRowAsync/InsertRowAsync döndürme görevi)

SynchronizationContext'i yeniden yakalamanız gerekmiyorsa ConfigureAwait (false) kullanılmasını öneririm. Eğer niyet ayrı threadpool dizisindeki bu bildirimlerin birçok çalıştırmak ise, olduğu

IList<TNotificationEntity> notifications = 
    await _notificationsTable.GetRowsByPartitionKeyAndRowKeyAsync(ToTicks(_now), userId, QueryComparisons.GreaterThanOrEqual) 
    .ConfigureAwait(false); 
await Task.WhenAll(
    notifications.Select(notification => 
    { 
     return Task.Run(async() => 
     { 
      await _notificationsTable.DeleteRowAsync(notification.PartitionKey, notification.RowKey).ConfigureAwait(false); 
      notification.PartitionKey = ToTicks(utcDateTimeToSend); 
      await _notificationsTable.InsertRowAsync(notification).ConfigureAwait(false); 
     }); 
    })).ConfigureAwait(false); 

. Bu, muhtemelen birden çok Sil/Eklemenin paralel olarak gittiğiniz anlamına gelir. Bu senin niyetin mi? GetRowsByPartitionKeyAndRowKeyAsync'un çok sayıda veri döndürmesi mümkün mü?

bildirimlerini bildirdiğiniz ve DB ile tek bir bağlantı içinde yürüteceğiniz daha toplu iş tabanlı bir yaklaşım oluşturmak mümkün olabilir mi?