任务当所有有多个tak都有自己的任务

时间:2016-04-09 07:00:48

标签: c# task-parallel-library

我想调用Task.WhenAll并等待一些任务,每个任务都有自己的子任务,我想知道我是否在我的实现中正确地做了,看起来有点冗长,我想知道是否有一个较短的版本。

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

1 个答案:

答案 0 :(得分:0)

您需要启动这些任务。此外,您可以使lamba异步,并在体内使用await。 (假设DeleteRowAsync / InsertRowAsync返回任务)

如果您不需要重新捕获SynchronizationContext,我建议使用ConfigureAwait(false)。

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

也就是说,如果您打算在单独的ThreadPool线程中运行许多通知。这意味着你可能有多个并行删除/插入。这是你的意图吗? GetRowsByPartitionKeyAndRowKeyAsync 是否可能会返回大量数据?

是否可以创建更基于批处理的方法,您可以在其中传递通知并在与数据库的单个连接中执行?