.net core .net-如何使用信号量LIM将代码块限制为一次仅200个线程

.net core .net-如何使用信号量LIM将代码块限制为一次仅200个线程,.net-core,concurrency,parallel-processing,semaphore,.net Core,Concurrency,Parallel Processing,Semaphore,我已经开发了一个.net核心Web API,在一个场景中,我有一个大约1000条记录的列表,每个记录都将循环通过并调用第三方API。第三方API有一个限制,即只能同时发送200个请求。因此,我使用了SemaphoreSlim,并将使用此代码块的线程数限制为200个,效果很好 当多个用户或多个请求进入此端点时,第三方api将抛出错误 如何限制信号量LIM在所有请求中仅使用200个线程(当多个用户或请求同时进入时) SemaphoreSlim\u concurrencySemaphoreForDes

我已经开发了一个.net核心Web API,在一个场景中,我有一个大约1000条记录的列表,每个记录都将循环通过并调用第三方API。第三方API有一个限制,即只能同时发送200个请求。因此,我使用了SemaphoreSlim,并将使用此代码块的线程数限制为200个,效果很好

当多个用户或多个请求进入此端点时,第三方api将抛出错误

如何限制信号量LIM在所有请求中仅使用200个线程(当多个用户或请求同时进入时)

SemaphoreSlim\u concurrencySemaphoreForDescartesCall=新的信号量lim(1200);
List searchList=新列表(searchCriteriaList.Count);
foreach(searchCriteriaList中的var标准)
{
wait_concurrency映射hore.WaitAsync();
searchList.Add(Task.Run)(异步()=>
{
searchDetailsViewModel searchResults=新的searchDetailsViewModel();
尝试
{
searchResults.searchResults=等待AsncCall(标准);
}
捕获(例外)
{
searchResults.ErrorMessage=“执行s搜索时出现问题。”;
}
最后
{
//在这里,我们立即释放节流阀
_并发Maphore.Release();
}
返回搜索结果;
},取消令牌);
}
searchDetailsViewModel[]searchResultsList=等待任务.WhenAll(搜索列表);
如何限制信号量LIM在所有请求中仅使用200个线程(当多个用户或请求同时进入时)

更改
信号量lim
实例的范围

目前,代码为每个请求创建一个
信号量lim
,因此每个请求限制为200个同时请求。要使
信号量lim
跨多个请求工作,应将其定义为在这些请求之间共享。将
信号量lim
封装在注入单例生存期的类型中,或者将
信号量lim
声明为
静态

SemaphoreSlim _concurrencySemaphoreForDescartesCall = new SemaphoreSlim(1,200);
    
    List<Task<searchDetailsViewModel>> searchList = new List<Task<searchDetailsViewModel>>(searchCriteriaList.Count);
        foreach (var criteria in searchCriteriaList)
        {
            await _concurrencySemaphore.WaitAsync();
            searchList.Add(Task.Run<searchDetailsViewModel>(async () =>
            {
                searchDetailsViewModel searchResults = new searchDetailsViewModel();
                try
                {
                    searchResults.searchResults = await AsncCall(criteria);
                }
                catch (Exception)
                {
                    searchResults.ErrorMessage = "There was a problem performing the s search.";
                }
                finally
                {
                    // here we release the throttler immediately
                    _concurrencySemaphore.Release();
                }
        
                return searchResults;
            }, cancellationToken));
        }
        
        searchDetailsViewModel[] searchResultsList = await Task.WhenAll(searchList);