Ако след надграждане до Windows 10 или .NET Framework 4.7.1 и забелязвате значително намаляване на производителността, когато бягате .NET Framework приложения, които използват Система.Диагностика.StackFrame клас, тогава тази публикация може да ви заинтересува. Ще разгледаме причината и след това ще предложим известни поправки за грешката.
Система.Диагностика.Производителността на StackFrame се влошава
Приложение, което има приемлива производителност на .NET Framework 4.7 или по-стари версии се изпълняват по-бавно, когато се изпълняват на .NET Framework 4.7.1. Приложенията обикновено разчитат на StackFrame, когато хвърлят .NET изключения. Ако това се случи с висока скорост (повече от 10 инцидента в секунда), приложенията могат да забавят значително (десетократно) и да работят значително по-бавно от преди.
Причина за системата.Диагностика.Производителността на StackFrame се влошава
The .NET Framework 4.7.1 в Windows 10 добави поддръжка за откриване и анализиране на преносим PDB файлов формат за показване на информация за номер на файл и ред в следи от стека. Като част от тази промяна, всяка функция в трасирането на стека има проверен дефиниращ модул, за да се определи дали този модул използва преносимия PDB формат. Поради някои разлики във вътрешната политика на кеширане, времето за изпълнение прекарва много повече време в търсене на преносими PDB от предишното .Версиите на NET Framework, прекарани в търсене на класически PDB на Windows.
Това кара форматираните следи от стека да се произвеждат по-бавно от преди.
Този проблем не променя броя на възникналите изключения. Това обаче значително намалява способността на приложенията да се справят с тези изключения.
Известно е, че приложенията, които използват библиотека IKVM, са засегнати от този проблем, ако те търсят сглобки. Известно е, че сондирането на възли причинява изключения.
Fix System.Диагностика.Проблем с влошаване на производителността на StackFrame
За да разреши този проблем, Microsoft препоръчва използването на някой от следните методи.
1] Използвайте различен конструктор за StackFrame, който приема булев аргумент
Това е предпочитаното решение.
Ако разработчиците на приложения могат да правят промени в своите приложения, обадете се на системата.Диагностика.StackTrace.#ctor (булев) конструктор чрез използване на фалшив аргумент, за да се избегне улавяне на информация за източника. Това избягва частта от кода, в която производителността е намалена.
2] Отмяна или надграждане до най-новата версия на Windows 10
В този метод се върнете към предишната версия / компилирайте или надстройте до най-новата версия / компилация на Windows 10, ако имате този проблем и в момента не използвате най-новата версия на Windows 10. Също така деинсталирайте .NET Framework 4.7.1, ако има такъв, от вашия компютър и след това изтеглете и инсталирайте предишна версия или най-новата версия на .NET Framework.
Надявам се това да помогне!