我想执行一堆 WebRequest,但设置了可以同时启动的阈值。
我遇到了这个LimitedConcurrencyTaskScheduler example并尝试像这样利用它
scheduler = new LimitedConcurrencyLevelTaskScheduler(1);
taskFactory = new TaskFactory(scheduler);
...
private Task<WebResponse> GetThrottledWebResponse(WebRequest request)
{
return taskFactory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null);
}
但是我注意到,即使最大并发数为 1,我的任务似乎也是以非 FIFO 顺序完成的。当我在 LimitedConcurrencyLevelTaskScheduler 中放置断点时,很明显它根本没有被使用。我想我使用 TaskFactory.FromAsync 的方式没有达到我的预期。
是否有适当的方法来限制并发 Web 请求?
最佳答案
When I put breakpoints in LimitedConcurrencyLevelTaskScheduler, it became apparent that it's not being used at all
这是正确的。 FromAsync
根本不使用TaskFactory
。事实上,我不太明白为什么这个方法不是静态的。
您有多种方法来实现限制。您可以使用 Microsoft.Tpl.Dataflow 中的 ActionBlock
。或者您可以使用 SemaphoreSlim
制作自己的:
private static readonly SemaphoreSlim Semaphore = new SemaphoreSlim(1);
private static async Task<WebResponse> GetThrottledWebResponse(WebRequest request)
{
await Semaphore.WaitAsync().ConfigureAwait(false);
try
{
return await request.GetResponseAsync().ConfigureAwait(false);
}
finally
{
Semaphore.Release();
}
}
关于c# - 限制网络请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43191699/