2017-04-03 37 views
2

我想执行一堆WebRequests,但设置了多少个可同时启动的阈值。节流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?

回答

2

当我把断点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(); 
    } 
} 
+0

谢谢,这是一个简单的解决方案! – Chris