ปิด C # / C ++ DLLImport หรืออย่างน้อยที่สุดยกเลิกการจัดสรรหน่วยความจำฮีป? [ปิด]

Jan 15 2021

ฉันมีแอปพลิเคชัน C # .NET Framework ที่เรียกใช้ C ++ DLL ที่ไม่มีการจัดการผ่านDLLImportเพื่อแยกวิเคราะห์ไฟล์จำนวนมากที่ผู้ใช้มอบให้และดำเนินการบางอย่าง

ฉันต้องการมีแถบความคืบหน้าในแอปพลิเคชัน C # ของฉันเนื่องจากการแยกวิเคราะห์ไฟล์นี้อาจใช้เวลานาน วิธีที่ดีที่สุดที่ฉันคิดจะทำคือแยกวิเคราะห์ไฟล์สองสามไฟล์พร้อมกันจากนั้นกลับไปที่รหัส C # เพื่อที่ฉันจะได้อัปเดตแถบความคืบหน้า

อย่างไรก็ตามสิ่งนี้ทำให้ฉันต้องจัดสรรหน่วยความจำบางส่วนบนฮีปของ C ++ DLL ดังนั้นฉันจึงไม่ต้องส่งเส้นทางไฟล์ 10,000+ ทั้งหมดเป็นอาร์กิวเมนต์ทุกครั้งที่ฉันต้องเรียกใช้ฟังก์ชัน C ++ อีกครั้ง

ฉันไม่แน่ใจว่าการปิด DLL หลังจากที่ฉันเสร็จสิ้นการแยกวิเคราะห์จะเป็นไปได้หรือไม่ มีวิธีอื่นใดบ้างที่ฉันสามารถทำงานนี้ให้สำเร็จโดยไม่ต้องเก็บเส้นทางทั้งหมดไว้ในหน่วยความจำที่จัดสรรไว้ตลอดเวลาที่แอปพลิเคชันกำลังทำงานอยู่

คำตอบ

3 RomanPolunin Jan 15 2021 at 05:35

เนื่องจากคุณได้ยืนยันแล้วว่าไฟล์เป็นอิสระคุณควรลองดำเนินการแบบขนาน

ในด้านผู้ผลิตของกระบวนการตั้งค่ารายการหรืออาร์เรย์ที่มีชื่อไฟล์ หากรายการใหญ่เกินไป (จริงๆใหญ่มากจนเน้น RAM ที่มี) คุณอาจต้องการแทนที่ด้วยการรวมกันของ BlockingCollection และ Queue เพื่อให้ผู้ผลิตสามารถควบคุมได้จนกว่าจำนวนรายการในท่อการประมวลผลจะต่ำกว่าเกณฑ์ .

อีกด้านหนึ่งของไปป์นี้เริ่มต้นผู้ปฏิบัติงาน (แบบอินไลน์หรือเป็นเธรดผู้ปฏิบัติงานแยกกัน) ซึ่งจะอ่านตามลำดับหรือ. AsParallel () อ่านรายการจากคอลเล็กชันและส่งต่อไปยังไลบรารีที่ไม่มีการจัดการเพื่อประมวลผล

เนื่องจากนี่เป็นแอปพลิเคชัน UI ฉันคิดว่าเธรดผู้ปฏิบัติงานของคุณควรแยกจากกัน ในแต่ละไฟล์ที่ประมวลผลแล้วให้ทำ .Invoke () บนแบบฟอร์ม UI เพื่ออัปเดตแถบความคืบหน้า