节流WebRequests

时间:2017-04-03 18:21:00

标签: c# multithreading httpwebrequest

我想执行一堆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顺序完成的。当我在LimitedConcurrencyLevelTask​​Scheduler中放置断点时,很明显它根本没有被使用。我想我使用TaskFactory.FromAsync的方式并没有达到我的预期。

是否有适当的方法来限制同步WebRequests?

1 个答案:

答案 0 :(得分:2)

  

当我在LimitedConcurrencyLevelTask​​Scheduler中放置断点时,显然它根本没有被使用

这是正确的。 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();
    }
}
相关问题