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実行すると、パフォーマンスが大幅に低下します。

アプリケーションは通常、.NET 例外をスローするときに依存 StackFrame します。 これが高い速度 (1 秒あたり 10 件を超えるインシデント) で発生した場合、アプリケーションの速度が大幅に低下し (10 倍)、実行速度が以前よりも著しく遅くなる可能性があります。

Windows のバージョンを確認するには、「 実行している Windows オペレーティング システム」を参照してください。

解決方法

この問題は、次の Windows 更新プログラムで修正されています。

この問題を回避するには、以下のいずれかの方法を使用します。

回避策 1 (推奨): ブール型引数を受け取る StackFrame に別のコンストラクターを使用する

アプリケーション開発者がアプリケーションに変更を加えることができる場合は、ソース情報を System.Diagnostics.StackTrace.#ctor(Boolean) キャプチャしないように false 引数を使用してコンストラクターを呼び出します。 これにより、パフォーマンスが低下するコードのセクションが回避されます。

回避策 2: システム バージョンをロールバックする

システムを以前のバージョンのWindows 10または.NET Frameworkにロールバックします。 それには、以下の手順を実行します。

以前のバージョンのWindows 10にロールバックする方法

  1. [設定] をき、[Update & Security]、[回復] の順に選択します。

  2. [Windows 10の以前のバージョンへの戻る] で、[作業の開始] を選択します。

    Windows 10 Recovery の以前のバージョンへの戻るオプションのスクリーンショット。

  3. ロールバックする理由を選択し、[ 次へ] を選択します。

    [戻る理由] ページのスクリーンショット。

  4. 更新プログラムのインストールをスキップ して[いいえ ]を選択します。

  5. [次へ] を 2 回選択し、[前のビルドに戻る] を選択します。

これらの手順を完了すると、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 ライブラリを使用するアプリケーションは、アセンブリをプローブする場合、この問題の影響を受けることがわかっている。 アセンブリのプローブでは、例外が発生することがわかっています。