为什么我的Task.WhenAll没有等到完成?

问题描述 投票:0回答:1

我在这里遇到了一个问题,你可能知道答案:我只是仍然无法弄清楚。

我正在为一个简单的场景创建一个种子:为给定的帖子添加“喜欢”。 方法签名是:

async Task GeneratePostLike(string postId, string userId, CancellationToken cancellationToken = default) {
    return await postLikeService.AddUserLikeToPost(
      new PostLikeInput { PostId = postId, UserId = userId },
      cancellationToken
    );
}

我想随机生成对帖子的点赞。我正在使用随机和其他机制来获取随机数来执行此操作。

当我使用旧的 for 循环块时,它会按照我想要的方式执行。这是我正在使用的说明:

var numberOfLikesForPost = random.Next(1, 100);
var randomUsersForLikes = await userService.GetRandomUsers(numberOfLikesForPost);

for (var likeIndex = 0; likeIndex < numberOfLikesForPost; likeIndex++)
{
  var randomUserId = randomUsersForLikes.PickRandom().Id;
  await GeneratePostLike(post.Id!, randomUserId, cancellationToken);
}

但是,当我尝试使用

Task.WhenAll
时,它只是执行一两次迭代并继续。看起来它的行为就像某种“一劳永逸”的行为。以下代码代表我正在使用
Task.WhenAll
块执行的操作:

var numberOfLikesForPost = random.Next(1, 100);
var randomUsersForLikes = await userService.GetRandomUsers(numberOfLikesForPost);

var generatePostLikeTasks = Enumerable.Repeat(
  GeneratePostLike(
    post.Id!,
    randomUsersForLikes.PickRandom().Id,
    cancellationToken
  ),
  numberOfLikesForPost
);

await Task.WhenAll(generatePostLikeTasks);

您对我可以添加什么以使我的

Task.WhenAll
块在继续之前正确等待整个任务执行有什么建议吗?

谢谢大家!

c# async-await task
1个回答
2
投票
var generatePostLikeTasks = Enumerable.Repeat(
  GeneratePostLike(
    post.Id!,
    randomUsersForLikes.PickRandom().Id,
    cancellationToken
  ),
  numberOfLikesForPost
);

这不会创建

numberOfLikesForPost
数量的任务,而只会重复相同的任务实例
numberOfLikesForPost
次。

您应该能够将其更改为类似的内容(尚未测试它,因为我目前无法访问 IDE):

var generatePostLikeTasks = Enumerable.Repeat(
  () => GeneratePostLike(
    post.Id!,
    randomUsersForLikes.PickRandom().Id,
    cancellationToken
  ),
  numberOfLikesForPost
).Select(f => f());
© www.soinside.com 2019 - 2024. All rights reserved.