คันเร่ง WebRequests

ฉันต้องการดำเนินการ WebRequests จำนวนมาก แต่กำหนดเกณฑ์ว่าสามารถเริ่มได้กี่รายการพร้อมกัน

ฉันเจอ LimitedConcurrencyTaskScheduler นี้ ตัวอย่างและพยายามใช้มันเช่นนั้น

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 เมื่อฉันใส่เบรกพอยต์ใน LimitedConcurrencyLevelTaskScheduler ปรากฏว่าไม่มีการใช้งานเลย ฉันเดาว่าวิธีที่ฉันใช้ TaskFactory.FromAsync ไม่ได้ทำสิ่งที่ฉันคาดหวังไว้

มีวิธีที่เหมาะสมในการเค้น WebRequests พร้อมกันหรือไม่


person Chris    schedule 03.04.2017    source แหล่งที่มา


คำตอบ (1)


เมื่อฉันใส่เบรกพอยต์ใน LimitedConcurrencyLevelTaskScheduler ปรากฏว่าไม่ได้ใช้งานเลย

ถูกต้อง. FromAsync ไม่ได้ใช้ TaskFactory เลย อันที่จริงฉันไม่เข้าใจจริงๆ ว่าทำไมวิธีนี้จึงไม่คงที่

คุณมีหลายวิธีในการดำเนินการควบคุมปริมาณ คุณสามารถใช้ ActionBlock จาก Microsoft.Tpl.Dataflow หรือคุณสามารถสร้างของคุณเองโดยใช้ 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
ขอบคุณ นั่นเป็นวิธีแก้ปัญหาที่ง่ายมาก! - person Chris; 04.04.2017