我想执行一堆WebRequests,但是设置一个可以同时启动多少个的阈值。
我遇到了这个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的方式并没有达到我的预期。
是否有适当的方法来限制同步WebRequests?
答案 0 :(得分:2)
当我在LimitedConcurrencyLevelTaskScheduler中放置断点时,显然它根本没有被使用
这是正确的。 FromAsync
根本不使用TaskFactory
。事实上,我并不真正理解为什么这种方法不是静态的。
您有多种方法可以实施限制。您可以使用ActionBlock
来自Microsoft.Tpl.Dataflow。或者你可以使用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();
}
}