linq 为什么Task.WhenAll不等待完成?

fkaflof6  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(111)

我在这里遇到了一个问题,你可能知道答案:我只是仍然无法弄清楚。
我在这里为一个简单的场景创建一个种子:向给定的帖子添加喜欢。方法签名是:

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


x1c 0d1x的数据
然而,当我尝试使用Task.WhenAll时,它只是执行一两次迭代并继续执行。看起来它的行为就像是某种类型的fire-and-forget。下面的代码代表了我对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块正确地等待所有任务的执行,然后再继续?

lymnna71

lymnna711#

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

相关问题