【问题标题】:Throttle WebRequests限制 Web 请求
【发布时间】:2017-08-28 17:41:13
【问题描述】:

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

是否有适当的方法来限制同时发生的 WebRequest?

【问题讨论】:

    标签: c# multithreading httpwebrequest


    【解决方案1】:

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

    没错。 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();
        }
    }
    

    【讨论】:

    • 谢谢,这是一个非常简单的解决方案!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2021-03-05
    相关资源
    最近更新 更多