ฉันมีโครงสร้างของคำสั่ง 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 รายดังกล่าว
ฉันทำอะไรผิดที่นี่?
Products
จะเป็นประเภทใด หากเป็นเพียงList<T>
คลาสนั้นไม่ปลอดภัยสำหรับเธรด และคุณกำลังทำลายคลาสในขณะที่คุณเขียนลงไปพร้อมกับหลายเธรดพร้อมกัน - person Scott Chamberlain   schedule 01.02.2017Parallel.xxx
จำนวนใดที่จะเปลี่ยนการกำหนดค่าเครือข่าย... คุณอาจสนใจ stackoverflow.com/questions/1361771/ - person Alexei Levenkov   schedule 01.02.2017