我在这里遇到了一个问题,你可能知道答案:我只是仍然无法弄清楚。
我正在为一个简单的场景创建一个种子:为给定的帖子添加“喜欢”。 方法签名是:
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
块在继续之前正确等待整个任务执行有什么建议吗?
谢谢大家!
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());