2016-04-09 5 views
0

Ich möchte einen Aufruf an Task.WhenAll und warten eine Reihe von Aufgaben, die jeweils ihre eigenen Teilaufgaben haben, und ich frage mich, ob ich es in meiner Implementierung richtig mache Es scheint ein wenig wortreich und ich frage mich, ob es eine kürzere Version dafür gibt.Task WhenAll mit mehreren Aufgaben, die alle ihre eigenen Aufgaben haben

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

Antwort

0

Sie müssten diese Aufgaben starten. Außerdem kannst du deine lamba async machen und im Körper warten. (Annahme DeleteRowAsync/InsertRowAsync gibt Task zurück)

Ich würde vorschlagen, ConfigureAwait (false) zu verwenden, wenn Sie den SynchronizationContext nicht erneut erfassen müssen.

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

Das heißt, wenn Ihre Absicht viele dieser Benachrichtigungen in einem separaten Thread Threadpool ausgeführt werden soll. Das heißt, Sie haben wahrscheinlich mehrere Delete/Insert parallel geschaltet. Ist das deine Absicht? Ist es möglich, dass GetRowsByPartitionKeyAndRowKeyAsync viele Daten zurückgibt?

Wäre es möglich, einen Batch-basierten Ansatz zu erstellen, bei dem Sie die Benachrichtigungen übergeben und innerhalb einer einzigen Verbindung zur DB ausführen?