C# 多个TAK都有自己的任务时的任务

C# 多个TAK都有自己的任务时的任务,c#,task-parallel-library,C#,Task Parallel Library,我想调用Task.whalll并等待许多任务,每个任务都有自己的子任务,我想知道我在实现中是否正确地执行了这些任务,它似乎有点冗长,我想知道是否有一个较短的版本 public async Task ChangeNotificationsDispatchTimeAsync(string userId, DateTime utcDateTimeToSend) { IList<TNotificationEntity> notifications = await _n

我想调用Task.whalll并等待许多任务,每个任务都有自己的子任务,我想知道我在实现中是否正确地执行了这些任务,它似乎有点冗长,我想知道是否有一个较短的版本

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);
            });
        }));        
}
public async Task ChangeNotificationsDispatchTimeAsync(字符串userId,DateTime utcDateTimeToSend)
{
IList通知=
等待notificationsTable.GetRowsByPartitionKeyandRokeySync(ToTicks(_now)、userId、QueryComparisons.GreaterThoreQual);
等待任务(
通知。选择(通知=>
{
返回新任务(()=>
{
_notificationsTable.DeleteRowAsync(notification.PartitionKey,notification.RowKey);
notification.PartitionKey=ToTicks(utcDateTimeToSend);
_notificationsTable.InsertRowAsync(通知);
});
}));        
}

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

如果不需要重新捕获SynchronizationContext,我建议使用ConfigureWait(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);
IList通知=
wait_notificationsTable.GetRowsByPartitionKeyAndRowKeyAsync(ToTicks(_now)、userId、QueryComparisons.GreaterThoreQual)
.配置等待(错误);
等待任务(
通知。选择(通知=>
{
返回任务。运行(异步()=>
{
wait _notificationsTable.DeleteRowAsync(notification.PartitionKey,notification.RowKey).configurewait(false);
notification.PartitionKey=ToTicks(utcDateTimeToSend);
wait _notificationsTable.insertrowsync(通知).configurewait(false);
});
})).配置等待(错误);
也就是说,如果您的目的是在一个单独的线程池线程中运行这些通知。这意味着您可能有多个删除/插入并行进行。这是你的意图吗?GetRowsByPartitionKeyandRokeySync是否可能返回大量数据

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