Permintaan Web Throttle

Saya ingin menjalankan banyak WebRequests, tetapi menetapkan ambang batas berapa banyak yang dapat dimulai secara bersamaan.

Saya menemukan LimitedConcurrencyTaskScheduler contoh dan mencoba memanfaatkannya seperti itu

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

...

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

Namun saya perhatikan bahwa bahkan dengan konkurensi maksimal 1, tugas saya sepertinya diselesaikan dalam urutan non-FIFO. Saat saya meletakkan breakpoint di LimitedConcurrencyLevelTaskScheduler, terlihat jelas bahwa breakpoint tersebut tidak digunakan sama sekali. Saya kira cara saya menggunakan TaskFactory.FromAsync tidak sesuai dengan harapan saya.

Apakah ada cara yang tepat untuk membatasi WebRequest secara bersamaan?


person Chris    schedule 03.04.2017    source sumber


Jawaban (1)


Ketika saya meletakkan breakpoint di LimitedConcurrencyLevelTaskScheduler, terlihat jelas bahwa itu tidak digunakan sama sekali

Itu betul. FromAsync tidak menggunakan TaskFactory sama sekali. Sebenarnya saya tidak begitu mengerti mengapa metode ini tidak statis.

Anda memiliki banyak cara untuk menerapkan pembatasan. Anda dapat menggunakan ActionBlock Dari Microsoft.Tpl.Dataflow. Atau Anda bisa membuatnya sendiri menggunakan 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();
    }
}
person Kevin Gosse    schedule 03.04.2017
comment
Terima kasih, itu adalah solusi yang mudah! - person Chris; 04.04.2017