c# - 限制网络请求

标签 c# multithreading httpwebrequest

我想执行一堆 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 的方式没有达到我的预期。

是否有适当的方法来限制并发 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/

相关文章:

c# - System.Net.Http 依赖问题

c# - 获取一年的周列表 - 带日期

c# - 如何将 Char 转换为 .Net 中的 Keycode?

c++ - 在程序终止前加入线程

c# - 如何从套接字接收到的字节 [] 创建 .NET HttpWebRequest 类

c# - 如何在C#中打印出HttpWebRequest?

.net - HTTPWebRequest、SSL端点验证和

c# - CheckedListBox显示不同的字符串c#

c++ - Select() 不在线程中工作

java - 死锁和资源排序