|
|
1
3
N+1问题
你可能想找到一个不同的解决方案。您必须为所有用户执行此操作吗?如果是,那么可以切换到后台进程 fan-out 回到步兵(顺便说一句,我得查一下)。
在.NET Core中,它们通常在一个单独的线程上完成,如果不完成,则等待一个几乎肯定是这样的HTTP请求。 您可能已经耗尽了线程池,但是由于您正在发出HTTP请求,我怀疑您已经耗尽了并发出站HTTP请求的数量。 “默认连接限制为ASP.NET托管应用程序和2个应用程序。” 参见文档 here 有没有一种方法可以实现某种并行性而不消耗资源(线程或http连接)?-是的。
下面是一个我经常实现的模式,因为这个原因,使用
仍然有10个异步HTTP请求
|
|
2
1
当
there is no thread
|
|
|
3
0
创建数千个任务没有问题。它们不是线。 核心问题是你对API的冲击太大了。因此,最好的解决方案将改变您对API的调用方式:
using var throttler = new SemaphoreSlim(10);
var userTasks = userIds.Select(async userId =>
{
await throttler.WaitAsync();
try { await GetUserDetailsAsync(userId); }
finally { throttler.Release(); }
});
var users = await Task.WhenAll(tasks); // users is User[]
同样,只有当您不能首先进行设计更改以避免数千个API调用时,这种限制才是最好的。 |