我想调用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);
});
}));
}
答案 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 是否可能会返回大量数据?
是否可以创建更基于批处理的方法,您可以在其中传递通知并在与数据库的单个连接中执行?