2017-04-03 36 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