我想运行一堆异步任务,并限制在任何给定时间可以完成的任务数量.
假设您有1000个网址,并且您只希望一次打开50个请求; 但只要一个请求完成,您就会打开与列表中下一个URL的连接.这样,一次只打开50个连接,直到URL列表用完为止.
如果可能的话,我也想利用给定数量的线程.
我提出了一种扩展方法,ThrottleTasksAsync可以实现我想要的功能.那里有更简单的解决方案吗?我认为这是一种常见的情况.
用法:
class Program
{
static void Main(string[] args)
{
Enumerable.Range(1, 10).ThrottleTasksAsync(5, 2, async i => { Console.WriteLine(i); return i; }).Wait();
Console.WriteLine("Press a key to exit...");
Console.ReadKey(true);
}
}
Run Code Online (Sandbox Code Playgroud)
这是代码:
static class IEnumerableExtensions
{
public static async Task<Result_T[]> ThrottleTasksAsync<Enumerable_T, Result_T>(this IEnumerable<Enumerable_T> enumerable, int maxConcurrentTasks, int maxDegreeOfParallelism, Func<Enumerable_T, Task<Result_T>> taskToRun)
{
var blockingQueue = new BlockingCollection<Enumerable_T>(new ConcurrentBag<Enumerable_T>());
var semaphore = new SemaphoreSlim(maxConcurrentTasks);
// Run the throttler on a separate thread.
var t = Task.Run(() => …Run Code Online (Sandbox Code Playgroud) 我正在尝试从机器发送大量 HTTP 请求。但似乎 .NET Core 或我不知道的 Windows 正在限制可以发出的并发 HTTP 请求的数量,或者给定时间段内 HTTP 请求的配额。
我怎样才能增加这个?我记得我们在 .NET Framework 中有一个配置,但我也找不到。
我正在使用HttpClient异步向外部api发出许多请求.我等待所有请求完成,然后在其他代码中使用响应.我的问题是,如果我发出太多请求,当我使用Task.WhenAll等待时,我的代码会引发异常.
这段代码最终将并行运行,我的意思是我将同时执行多组这些异步请求(即10组200个异步请求).我已经实例化了一个HttpClient,我正在使用.NET 4.5异步/等待修饰符,如下所示:
using (var client = new HttpClient())
{
// make a list of tasks
List<Task<HttpResponseMessage>> taskList;
List<MyData> replies;
for (int i = 0; i < MAX_NUMBER_REQUESTS; i++)
{
taskList.Add(client.GetAsync(externalUri);
}
List<HttpResponseMessage> responses = await Task.WhenAll(taskList);
// read each response after they have returned
foreach (var response in responses)
{
var reader = new System.IO.StreamReader(await response.Content.ReadAsStreamAsync());
replies.Add(JsonConvert.DeserializeObject<MyData>(reader.ReadToEnd()));
reader.Close();
}
foreach (var reply in replies)
{
// do something with the response from the external api call...
}
}
Run Code Online (Sandbox Code Playgroud)
我一直得到一个TaskCanceledException.在调查之后,我看到这可能是一个超时问题.我不知道如何解决它.在尝试使用Task.WhenAll并重复之前,我试图在100个请求中批量处理我的请求.然后,当我与三组100个请求失败并行运行时.我错过了什么,有没有人对此有任何见解?
c# ×3
async-await ×2
.net-4.5 ×1
.net-core ×1
asynchronous ×1
concurrency ×1
http ×1
semaphore ×1
throttling ×1
tpl-dataflow ×1