Windows 10 和 .NET Framework 4.7.1 中的 System.Diagnostics.StackFrame 性能下降

本文有助于修复以下问题:升级到 Windows 10 或 Microsoft .NET Framework 4.7.1 后,使用 System.Diagnostics.StackFrame 的应用程序运行速度比之前慢。

适用于: Windows 10 版本 1803、Windows 10 版本 1709
原始 KB 数: 4057154

现象

从 2017 年 10 月开始,升级到 Windows 10 或 .NET Framework 4.7.1 后,运行使用该 System.Diagnostics.StackFrame 类的 .NET Framework 应用程序时,性能明显下降。

应用程序通常依赖于 StackFrame 它们引发 .NET 异常时。 如果这种情况以较高的速率(每秒超过 10 个事件)发生,则应用程序可能会明显降低(十倍),并且运行速度明显慢于以前。

若要确定你的 Windows 版本,请参阅我运行的哪个 Windows 操作系统?

解决方法

此问题在以下 Windows 更新中已修复。

要解决此问题,请使用下列方法之一。

解决方法 1(首选):对采用布尔参数的 StackFrame 使用不同的构造函数

如果应用程序开发人员能够对其应用程序进行更改,请使用 false 参数调用 System.Diagnostics.StackTrace.#ctor(Boolean) 构造函数以避免捕获源信息。 这样就避免了性能下降的代码部分。

解决方法 2:回滚系统版本

将系统回滚到早期版本的 Windows 10 或 .NET Framework。 要设置部门,请按照以下步骤操作。

如何回滚到早期版本的 Windows 10

  1. 打开“设置”,选择“更新和安全,然后选择“恢复”。

  2. “返回到以前版本的 Windows 10”下,选择“ 入门”。

    Windows 10 恢复中“返回到以前的版本”选项的屏幕截图。

  3. 选择回滚的原因,然后选择“ 下一步”。

    返回页的屏幕截图。

  4. 选择 “否”,这要归功于 跳过安装更新。

  5. 选择“下一步两次”,然后选择“返回早期版本”。

完成这些步骤后,Windows 10 将还原系统的早期版本。

还原以前版本的 Windows 屏幕的屏幕截图。

如何回滚到 .NET Framework 的早期版本

Windows 7 SP1 和 Windows Server 2008 R2 SP1 的步骤:

  1. 控制面板中打开“程序和功能”项。

  2. “卸载或更改程序 ”列表中,找到并选择 Microsoft .NET Framework 4.7.1,然后选择“ 卸载/更改”。

    控制面板中的程序和功能中 .Net Framework 4.7.1 的“卸载/更改”选项的屏幕截图。

  3. 从此计算机中选择“删除 .NET Framework 4.7.1”,然后选择“下一步”。

    从此计算机选项中删除 .NET Framework 4.7.1 的屏幕截图。

  4. 选择“继续以确认卸载。

  5. 完成卸载后,选择“ 完成 ”。

    屏幕截图显示已从此计算机中删除 .NET Framework 4.7.1。

  6. 如果系统提示你执行此操作,请重新启动计算机。

注意

卸载 .NET Framework 4.7.1 后,计算机不再安装任何版本的 .NET Framework 4。 必须重新安装 .NET Framework 4 版本。

Windows 8.1、Windows Server 2012、Windows Server 2012 R2 和 Windows 10 版本 1607 的步骤:

  1. 控制面板中打开“程序和功能”项。 为此,请在“搜索”框中键入appwiz.cpl

  2. 选择“ 查看已安装的更新”。

    程序和功能中“查看已安装的更新”页的屏幕截图。

  3. 根据 Windows 版本,右键单击以下项之一,然后单击“ 卸载” :

    • Windows Server 2012: Microsoft Windows 的更新(KB4033345)
    • Windows 8.1 或 Server 2012 R2: 适用于 Microsoft Windows 的更新(KB4033369)
    • Windows 10 版本 1607: Microsoft Windows 更新(KB4033369)
  4. 单击“是以确认卸载。

  5. 如果系统提示你执行此操作,请重新启动计算机。

详细信息

有关特定应用程序引发的 .NET 异常数量的详细信息,请参阅 异常性能计数器

有关如何度量应用程序的异常速率的详细信息,请参阅 运行时分析

注意

此问题不会更改引发的异常数。 但是,它确实会显著减少应用程序处理这些异常的能力。 有关此问题的详细信息,请参阅 此 GitHub 文章

如果应用程序探测程序集,则已知使用 IKVM 库的应用程序会受到此问题的影响。 已知探测程序集会导致异常。