เพิ่มการใช้งาน Parallel.For หรือ Parallel.Foreach loop ให้สูงสุด

ฉันมีโครงสร้างของคำสั่ง Parallel.For และ PLINQ ที่ซ้อนกันในแอปคอนโซลขนาดเล็กของฉันซึ่งโดยพื้นฐานแล้วจะดำเนินการที่เชื่อมโยงกับเครือข่าย (ดำเนินการคำขอ http) ดังต่อไปนี้:

รายชื่อผู้ใช้ถูกกรอกจาก DB โดยที่ฉันทำตาม:

Parallel.For(0,users.count(), index=>{

// here I try to perform HTTP requests for multiple users

});

จากนั้นภายใน for loop นี้ ฉันใช้คำสั่ง plinq เพื่อดึงข้อมูลผู้ใช้นี้ผ่านคำขอ HTTP

ตอนนี้โดยรวมแล้วฉันได้สองลูปที่ซ้อนกันดังต่อไปนี้:

Parallel.For(0,users.count(), index=>{

// Some stuff is done before the PLINQ statement is called... 
newFilteredList.AsParallel().WithDegreeOfParallelism(60).ForAll(qqmethod =>
    {
        var xdocic = new XmlDocument();
        xdocic.LoadXml(SendXMLRequestToEbay(null, null, qqmethod.ItemID, true, TotalDaysSinceLastUpdate.ToString(), null));
        int TotalPages = 0;
        if (xdocic.GetElementsByTagName("TotalNumberOfPages").Item(0) != null)
        {
            TotalPages = Convert.ToInt32(xdocic.GetElementsByTagName("TotalNumberOfPages").Item(0).InnerText);
        }
        if (TotalPages > 1)
        {
            for (int i = 1; i < TotalPages + 1; i++)
            {
                Products.Add(SendXMLRequestToEbay(null, null, qqmethod.ItemID, false, TotalDaysSinceLastUpdate.ToString(), i.ToString()));
            }
        }
        else
        {
            Products.Add(SendXMLRequestToEbay(null, null, qqmethod.ItemID, false, TotalDaysSinceLastUpdate.ToString(), "1"));
        }
    });
});

ฉันลองใช้ for loop ภายนอกเหมือนปกติ และสังเกตเห็นว่ามันทำงานได้เร็วกว่าและดีกว่าแบบนี้มาก

สิ่งที่ฉันกังวลส่วนใหญ่คือฉันกำลังตรวจสอบการใช้งาน CPU เมื่อเรียกใช้แอปคอนโซลเช่นนี้ มันมักจะใกล้เคียง 0.5-3% ของพลังงาน CPU ทั้งหมด...

ดังนั้นวิธีที่ฉันพยายามดำเนินการร้องขอ HTTP จึงเป็นดังนี้:

ผู้ใช้ 15 รายต่อครั้ง * จำนวนคำขอ HTTP สำหรับผู้ใช้ 15 รายดังกล่าว

ฉันทำอะไรผิดที่นี่?


comment
คลาส Parallel ไม่ใช่สำหรับงานที่ไม่เกี่ยวข้องกับ CPU คำขอ HTTP ถูกผูกไว้กับ I/O นอกจากนี้ Products จะเป็นประเภทใด หากเป็นเพียง List<T> คลาสนั้นไม่ปลอดภัยสำหรับเธรด และคุณกำลังทำลายคลาสในขณะที่คุณเขียนลงไปพร้อมกับหลายเธรดพร้อมกัน   -  person Scott Chamberlain    schedule 01.02.2017
comment
@ScottChamberlain คุณจะแนะนำฉันว่าฉันจะแทนที่ด้านนอกอันแรกด้วย for loop ด้วย then ? ฉันต้องการที่จะประมวลผล 15 และส่งคำขอ http พร้อมกัน 15 รายการสำหรับผู้ใช้เหล่านั้น ฉันจะทำอย่างไร   -  person User987    schedule 01.02.2017
comment
@ScottChamberlain ผลิตภัณฑ์เป็นถุงพร้อมกัน =)   -  person User987    schedule 01.02.2017
comment
ใช้ Dataflow แทน คุณสามารถมีสองบล็อกในห่วงโซ่ หนึ่งบล็อกสำหรับส่งคำขอ หนึ่งบล็อกสำหรับการประมวลผล คุณสามารถตั้งค่าระดับสูงสุดของความขนานสำหรับแต่ละบล็อกได้   -  person Scott Chamberlain    schedule 01.02.2017
comment
@ScottChamberlain คุณช่วยฉันหน่อยได้ไหม? ฉันจะเขียนตัวอย่างเชิงปฏิบัติสำหรับกรณีเฉพาะของฉันนี้ได้อย่างไร   -  person User987    schedule 01.02.2017
comment
ดูครึ่งหลังของ คำตอบเก่าของฉัน มีสองบล็อก บล็อกหนึ่งรับบันทึกแบบขนาน จากนั้นอีกบล็อกหนึ่งประมวลผลบันทึกเหล่านั้นทีละรายการเพื่อเพิ่มลงในรายการ คุณสามารถแปลงบล็อกที่ 2 เพื่อประมวลผลตามที่คุณต้องการและตั้งค่าเป็นระดับขนานที่สูงกว่า 1   -  person Scott Chamberlain    schedule 01.02.2017
comment
หมายเหตุด้านข้าง: ไม่มีการโทร Parallel.xxx จำนวนใดที่จะเปลี่ยนการกำหนดค่าเครือข่าย... คุณอาจสนใจ stackoverflow.com/questions/1361771/   -  person Alexei Levenkov    schedule 01.02.2017