หากหลังจากคุณอัปเกรดเป็น Windows 10 หรือ .NET Framework 4.7.1 และคุณสังเกตเห็นประสิทธิภาพการทำงานลดลงอย่างมากเมื่อคุณเรียกใช้แอปพลิเคชัน .NET Framework ที่ใช้ System.Diagnostics.StackFrame ชั้นเรียนแล้วโพสต์นี้อาจสนใจคุณ เราจะพิจารณาสาเหตุ แล้วเสนอการแก้ไขข้อผิดพลาดที่ทราบแล้ว
ประสิทธิภาพของ System.Diagnostics.StackFrame ลดลง
แอปพลิเคชันที่มีประสิทธิภาพการทำงานที่ยอมรับได้ที่ทำงานบน .NET Framework 4.7 หรือเวอร์ชันก่อนหน้าทำงานช้ากว่าเมื่อทำงานบน .NET Framework 4.7.1 แอปพลิเคชันมักใช้ StackFrame เมื่อมีข้อยกเว้น .NET หากสิ่งนี้เกิดขึ้นในอัตราที่สูง (มากกว่า 10 เหตุการณ์ต่อวินาที) แอปพลิเคชันอาจช้าลงอย่างมาก (สิบเท่า) และทำงานช้ากว่าเมื่อก่อนอย่างเห็นได้ชัด
สาเหตุของประสิทธิภาพของ System.Diagnostics.StackFrame ลดลง
.NET Framework 4.7.1 ใน Windows 10 เพิ่มการรองรับสำหรับการตรวจจับและแยกวิเคราะห์รูปแบบไฟล์ Portable PDB เพื่อแสดงข้อมูลไฟล์และหมายเลขบรรทัดในสแต็กเทรซ ส่วนหนึ่งของการเปลี่ยนแปลงนี้ แต่ละฟังก์ชันในการติดตามสแต็กจะมีการตรวจสอบโมดูลที่กำหนดเพื่อตรวจสอบว่าโมดูลนั้นใช้รูปแบบ Portable PDB หรือไม่ เนื่องจากความแตกต่างบางประการในนโยบายการแคชภายใน รันไทม์จึงใช้เวลาค้นหา Portable PDB มากกว่า .NET Framework เวอร์ชันก่อนหน้าที่ใช้ค้นหา Windows PDB แบบคลาสสิก
ซึ่งจะทำให้สร้าง stack trace ที่จัดรูปแบบช้ากว่าที่เคย
ปัญหานี้ไม่ได้เปลี่ยนจำนวนของข้อยกเว้นที่เกิดขึ้น อย่างไรก็ตาม มันลดความสามารถของแอปพลิเคชันในการจัดการข้อยกเว้นเหล่านั้นลงอย่างมาก
แอปพลิเคชันที่ใช้ไลบรารี IKVM จะได้รับผลกระทบจากปัญหานี้หากตรวจสอบหาแอสเซมบลี การตรวจวัดแอสเซมบลีทำให้เกิดข้อยกเว้น
แก้ไขปัญหาประสิทธิภาพของ System.Diagnostics.StackFrame ลดลง
ในการแก้ไขปัญหานี้ Microsoft ขอแนะนำให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้
1] ใช้ตัวสร้างอื่นสำหรับ StackFrame ที่ใช้อาร์กิวเมนต์บูลีน
นี่เป็นวิธีแก้ปัญหาที่ต้องการ
หากนักพัฒนาแอปพลิเคชันสามารถเปลี่ยนแปลงแอปพลิเคชันของตนได้ ให้เรียกตัวสร้าง System.Diagnostics.StackTrace.#ctor(Boolean) โดยใช้อาร์กิวเมนต์เท็จเพื่อหลีกเลี่ยงการรวบรวมข้อมูลต้นฉบับ ซึ่งจะหลีกเลี่ยงส่วนของโค้ดที่ประสิทธิภาพลดลง
2] ย้อนกลับหรืออัปเกรดเป็น Windows 10 เวอร์ชันล่าสุด
ในวิธีนี้ ให้ย้อนกลับไปเป็นเวอร์ชันก่อนหน้า/บิวด์หรืออัปเกรดเป็นเวอร์ชันล่าสุด/บิวด์ของ Windows 10 หากคุณประสบปัญหานี้และคุณไม่ได้ใช้ Windows 10 เวอร์ชันล่าสุด ถอนการติดตั้ง .NET Framework 4.7 ด้วย .1 หากมี จากคอมพิวเตอร์ของคุณ จากนั้นดาวน์โหลดและติดตั้งเวอร์ชันก่อนหน้าหรือ .NET Framework เวอร์ชันล่าสุด
หวังว่านี่จะช่วยได้!