gpt4 book ai didi

c# - 节流 WebRequests

转载 作者:行者123 更新时间:2023-11-30 23:14:16 27 4
gpt4 key购买 nike

我想执行一堆 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?

最佳答案

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# - 节流 WebRequests,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43191699/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com