首页 > 解决方案 > 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();
    }
}

谢谢!!

标签: c#asp.net-coreparallel-processing

解决方案


我怎样才能以这样一种方式编写此代码,以确保它不会同时建立超过 10 个连接?

节流异步代码通常通过以下方式完成SemaphoreSlim

private readonly SemaphoreSlim _throttle = new SemaphoreSlim(10);
public async Task<Player> GetMarket(PlayerViewModel p)
{
  await _throttle.WaitAsync();
  try
  {
    ...
  }
  finally
  {
    _throttle.Release();
  }
}

推荐阅读