หากหลังอัปเกรดเป็น 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 ครั้งต่อวินาที) แอปจะช้าลงมาก (10 เท่า) และช้าขึ้นชัดเจน
สาเหตุของปัญหาประสิทธิภาพ System.Diagnostics.StackFrame ลดลง
.NET Framework 4.7.1 ใน Windows 10 เพิ่มการรองรับการตรวจจับและการแยกวิเคราะห์รูปแบบไฟล์ Portable PDB เพื่อแสดงข้อมูลไฟล์และหมายเลขบรรทัดในสแต็กทร้อกส่วนหนึ่งของการเปลี่ยนแปลงนี้ แต่ละฟังก์ชันในสแต็กทร้อกจะมีโมดูลที่กำหนดถูกตรวจสอบว่ามีการใช้รูปแบบ Portable PDB หรือไม่ เนื่องจากความแตกต่างในนโยบายแคชภายใน รันไทม์ใช้เวลานานมากในการค้นหา Portable PDBs มากกว่าที่ .NET Framework เวอร์ชันก่อนหน้าใช้ค้นหา Windows PDBs แบบคลาสสิก
ทำให้การสร้างสแต็กทร้อกที่จัดรูปแบบแล้วช้าลงกว่าเดิม
ปัญหานี้ไม่เปลี่ยนจำนวนข้อยกเว้นที่ถูกโยน แต่ลดความสามารถของแอปพลิเคชันในการจัดการข้อยกเว้นเหล่านั้นอย่างมีนัยสำคัญ
แอปพลิเคชันที่ใช้ไลบรารี IKVM ถูกทราบว่าถูกกระทบหากทำการสแกนหาแอสเซมบลี การสแกนหาแอสเซมบลีเป็นสาเหตุของข้อยกเว้น
แก้ไขปัญหาประสิทธิภาพ System.Diagnostics.StackFrame ลดลง
Microsoft แนะนำให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้:
1. ใช้ Constructor อื่นของ StackFrame ที่รับอาร์กิวเมนต์ Boolean
นี่คือวิธีแก้ไขที่แนะนำ
หากนักพัฒนาสามารถเปลี่ยนแอปพลิเคชันได้ ให้เรียก Constructor System.Diagnostics.StackTrace.#ctor(Boolean) โดยใช้อาร์กิวเมนต์ false เพื่อหลีกเลี่ยงการบันทึกข้อมูลแหล่งที่มา ซึ่งหลีกเลี่ยงส่วนของโค้ดที่ประสิทธิภาพลดลง
2. ย้อนกลับหรืออัปเกรดเป็น Windows 10 เวอร์ชันล่าสุด
ในวิธีนี้ ให้ย้อนกลับเป็นเวอร์ชัน/บิลด์ก่อนหน้า หรืออัปเกรดเป็นเวอร์ชัน/บิลด์ล่าสุดของ Windows 10 หากประสบปัญหานี้และไม่ได้รัน Windows 10 ล่าสุดอยู่ ยังควรถอนการติดตั้ง .NET Framework 4.7.1 (ถ้ามี) แล้วดาวน์โหลดและติดตั้ง .NET Framework เวอร์ชันก่อนหน้าหรือล่าสุด
หวังว่าจะช่วยได้!