2017-04-03 16 views
2

私はWebRequestsの束を実行したいが、同時に何人が起動できるかの閾値を設定したい。スロットルWebRequests

私も1の最大同時実行して、私の仕事は、ように見えたことに気づいたしかし、私は

private Task<WebResponse> GetThrottledWebResponse(WebRequest request) 
    { 
     return taskFactory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null); 
    } 

...このLimitedConcurrencyTaskScheduler exampleに出くわしたので、

scheduler = new LimitedConcurrencyLevelTaskScheduler(1); 
taskFactory = new TaskFactory(scheduler); 

のようにそれを利用しようとしました非FIFO順序で完了します。私がLimitedConcurrencyLevelTask​​Schedulerにブレークポイントを置くと、それが全く使われていないことが明らかになりました。私はTaskFactory.FromAsyncを使って私が予想していたことをやっていないと思います。

同時にWebRequestsを抑制する適切な方法はありますか?

答えて

2

私はLimitedConcurrencyLevelTask​​Schedulerにブレークポイントを置くとき、それは正しいこと、それはすべての

で使用されていないことが明らかになりました。 FromAsyncTaskFactoryをまったく使用していません。実際、この方法がなぜ静的でないのか、私は本当に分かりません。

スロットルを実装する方法は複数あります。 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