ฉันมีข้อกำหนดในการสร้างกระบวนการที่ปรับขนาดได้ กระบวนการนี้มีการดำเนินการ I/O เป็นหลัก โดยมีการดำเนินการ CPU เล็กน้อยบางส่วน (ส่วนใหญ่เป็นสตริงการดีซีเรียลไลซ์) กระบวนการค้นหาฐานข้อมูลเพื่อดูรายการ URL จากนั้นดึงข้อมูลจาก URL เหล่านี้ ดีซีเรียลไลซ์ข้อมูลที่ดาวน์โหลดไปยังอ็อบเจ็กต์ จากนั้นคงข้อมูลบางส่วนไว้ใน CRM Dynamics และไปยังฐานข้อมูลอื่นด้วย หลังจากนั้นฉันต้องอัปเดตฐานข้อมูลแรกที่มีการประมวลผล URL ส่วนหนึ่งของข้อกำหนดคือการทำให้สามารถกำหนดค่าระดับความขนานได้
ในตอนแรก ฉันคิดว่าจะใช้มันตามลำดับงานโดยมีการรอคอยและจำกัดความเท่าเทียมโดยใช้ Semaphore ซึ่งค่อนข้างง่าย จากนั้นฉันก็อ่านโพสต์และคำตอบบางส่วนที่นี่ของ @Stephen Cleary ซึ่งแนะนำให้ใช้ TPL Dataflow และฉันคิดว่านี่อาจเป็นตัวเลือกที่ดี อย่างไรก็ตาม ฉันต้องการให้แน่ใจว่าฉันกำลัง "ทำให้โค้ดซับซ้อน" โดยใช้ Dataflow เพื่อสาเหตุที่สมควร ฉันยังได้รับคำแนะนำให้ใช้ วิธีการขยาย ForEachAsync ซึ่งใช้งานง่ายเช่นกัน แต่ฉันไม่แน่ใจว่ามันจะไม่ทำให้เกิดโอเวอร์เฮดหน่วยความจำหรือไม่เนื่องจากวิธีที่แบ่งพาร์ติชันคอลเลกชัน
TPL Dataflow เป็นตัวเลือกที่ดีสำหรับสถานการณ์เช่นนี้หรือไม่ จะดีกว่าวิธี Semaphore หรือ ForEachAsync อย่างไร - ฉันจะได้ประโยชน์อะไรบ้างหากใช้งานผ่าน TPL DataFlow เหนือตัวเลือกอื่นๆ (Semaphore/ForEachASync)
ActionBlock
โดยที่MaxDegreeOfParallelism
สามารถกำหนดค่าได้ จากสิ่งที่ฉันเข้าใจ TPL จัดการเธรดพูลให้คุณอย่างมีประสิทธิภาพ แต่มี ปัญหาอื่นๆ บางประการ ฉันอยากให้มันเรียบง่าย แค่จำกัดจำนวนงานที่ทำในคราวเดียว นั่นคือสิ่งที่คุณกำลังทำอยู่หรือเปล่า? - person Polynomial Proton   schedule 31.07.2018TPL Dataflow is great, especially if you're looking to limit work in one part of a larger pipeline
อย่างไรก็ตาม หากมีการเร่งความเร็วเพียงครั้งเดียว สัญญาณก็เพียงพอแล้ว - person Polynomial Proton   schedule 31.07.2018