c# - Aspnet 核心并行请求最大同时连接数
问题描述
我正在尝试并行化对我的 api 服务的一些调用。我找到了这个例子,它工作正常。唯一的问题是我调用的服务器最多接受 10 个同时连接,结果是一些调用失败。我怎样才能以这样一种方式编写此代码,以确保它不会同时建立超过 10 个连接?
List<PlayerViewModel> p; // my list of 700 element
List<Player> listFinalPlayer = new List<Player>(); //final List
var batchSize = 100;
int numberOfBatches = (int)Math.Ceiling((double)p.Count() / batchSize);
for (int i = 0; i < numberOfBatches; i++)
{
var currentIds = p.Skip(i * batchSize).Take(batchSize);
var tasks = currentIds.Select(p => GetMarket(p));
.AddRange(await Task.WhenAll(tasks));
}
public async Task<Player> GetMarket(PlayerViewModel p)
{
try
{
HttpRequestMessage tirthRequest = createRequest("https://myapiprovider/v2/players/" + p.id + "/marketvalue");
var client3 = _clientFactory.CreateClient();
var response3 = await client3.SendAsync(tirthRequest);
Market market = JsonConvert.DeserializeObject<Market>(await response3.Content.ReadAsStringAsync());
Player finalPlayer = new Player();
finalPlayer.PlayerId = id;
finalPlayer.MarketValue = market.marketValue;
finalPlayer.Value = Convert.ToDouble(market.marketValue) / Convert.ToDouble(1000000);
return finalPlayer;
} catch(Exception e)
{
//Here I receive to many request from server
return new Player();
}
}
谢谢!!
解决方案
我怎样才能以这样一种方式编写此代码,以确保它不会同时建立超过 10 个连接?
节流异步代码通常通过以下方式完成SemaphoreSlim
:
private readonly SemaphoreSlim _throttle = new SemaphoreSlim(10);
public async Task<Player> GetMarket(PlayerViewModel p)
{
await _throttle.WaitAsync();
try
{
...
}
finally
{
_throttle.Release();
}
}
推荐阅读
- django - 更改 DRF 路由器中的查找正则表达式
- python - Minimax 函数为井字棋中所有可能的移动返回相同的评估
- python - 修补从模拟类调用的类函数
- python - 如何从 JSON 文件中删除键/对象?
- javascript - Gatsby Remark 用于画廊、视频、学分等的边车文件?
- php - PHP将值推送到键的子数组中
- java - 在使用 java 的电梯系统方面需要帮助
- javascript - HTTP 代码 400 将 Javascript POST 转换为 Python POST
- c# - 为什么WebBrowser获取手机屏幕大小,获取电脑屏幕大小需要设置属性吗?
- java - 如何捕获异常并且不停止代码执行