簡體   English   中英

節氣門/阻止異步HTTP請求

[英]Throttle/block async http request

我有許多生產者任務,可以將數據推送到BlockingCollection中,我們稱之為requestQueue。

我還有一個使用者任務,該任務從requestQueue彈出請求,並將異步http請求轉發到遠程Web服務。

我需要限制或阻止發送到Web服務的活動請求的數量。 在遠離服務或互聯網連接較慢的某些計算機上,http響應時間足夠長,以至於活動請求的數量會填滿比我想要的更多的內存。

目前,我正在使用信號量方法,在使用者線程上多次調用WaitOne,並在HTTP響應回調上釋放。 有沒有更優雅的解決方案?

我綁定到.net 4.0,並且想要一個基於標准庫的解決方案。

您已經在使用BlockingCollection為什么要使用WaitHandle

我要這樣做的方法是有一個BlockingCollection其中n為邊界容量,其中n是您希望在任何給定時間擁有的並發請求的最大數量。

然后,您可以做類似...的事情。

var n = 4;
var blockingQueue = new BlockingCollection<Request>(n);

Action<Request> consumer = request => 
{
    // do something with request.
};

var noOfWorkers = 4;
var workers = new Task[noOfWorkers];

for (int i = 0; i < noOfWorkers; i++)
{
    var task = new Task(() =>
    {
        foreach (var item in blockingQueue.GetConsumingEnumerable())
        {
            consumer(item);
        }
    }, TaskCreationOptions.LongRunning | TaskCreationOptions.DenyChildAttach);
    workers[i] = task;
    workers[i].Start();
}

Task.WaitAll(workers);

我讓您處理取消和錯誤處理,但是使用此方法,您還可以控制在任何給定時間想要擁有多少個工人,如果這些工人忙於發送和處理請求,則將阻止其他任何生產者,直到有更多可用空間為止在隊列中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM