0

假设 ASP.NET WebAPI 请求到达控制器方法。

假设请求代表一个需要处理的“事件”。该事件具有与其关联的多个操作,应并行执行。例如,每个操作可能需要调用其他服务器上的特定 REST 端点,这是 I/O 绑定操作,应该尽快开始,并且不应该在开始下一个之前等待一个返回。

实现此模式的最正确/最有效的方法是什么?

我读过使用 Task.Run 是一个坏主意,因为它只是抓取额外的 ThreadPool 线程,使主请求线程空闲/阻塞。如果我正在运行单个任务,这是有道理的,但我不确定该建议是否适用于这种情况。

例如,如果事件有 4 个操作需要完成(每个操作可能有多个自己的 I/O 绑定调用),我会在循环中调用 Task.Run 4 次来初始化每个操作,然后等待生成的任务Task.WaitAll.

Q1: 在等待 Task.WaitAll 返回时,主请求线程是否会返回到 ThreadPool 以供另一个请求使用,还是只会占用主线程使其空闲直到 Task.WaitAll 完成?

Q2:如果它占用主线程,是否可以通过使用async关键字标记控制器方法并使用await Task.WhenAll调用来解决?我想象这会在等待时将主线程返回到池中,允许它用于其他请求或事件操作。

Q3:由于Task.Run排队了一个可能在 I/O 绑定调用上阻塞的工作项,如果所有操作都使用基于任务的异步 I/O 方法的调用来实现async和使用,性能会提高吗?await

关于使用 Task.Run 进行事件操作的整个方法,目标只是尽快启动所有操作的 I/O 绑定调用。我想如果(如在 Q3 中)所有操作都是async方法,我可以让它们都在循环中的主请求线程上启动,但我不确定这会比使用单独的 Task.Run 调用启动它们更好。也许有一种我不知道的完全不同的方法。

4

0 回答 0