0

他のスレッドを使用する可能性のあるプロパティになると、ウォッチ式がすぐに中断されるという問題があります。「関数の評価にはすべてのスレッドを実行する必要があります」というメッセージは表示したくありませんが、「安全でない」可能性があり、永続的なプロパティを実行しないデバッガー機能を使用したいと考えています。

イミディエイト ウィンドウで式を入力すると ThreadAbortException がスローされることがわかったので、この例外を処理して、評価中にウォッチ ウィンドウのスレッド実行を続行するようにしました。しかし、うまくいきませんでした。

次の状況があります:

public partial class DummyClassWithDebuglessProperties
{
    public static int countPrompt = 0;
    public static int countSuccess = 0;
    public static int countThreadAbortException = 0;

    #region Properties

    public string StringPropertyDebugFail
    {
        get
        {
            countPrompt++;
            Debugger.NotifyOfCrossThreadDependency();
            countSuccess++;
            return "complex";
        }
    }

    public string StringProperty
    {
        get
        {
            return "simple";
        }
    }

    public string AllProperties
    {
        get
        {
            string stringPropertyDebugFail = "";
            try
            {
                stringPropertyDebugFail = StringPropertyDebugFail;
            }
            catch (ThreadAbortException)
            {
                countThreadAbortException++;
                stringPropertyDebugFail = "failedReading";
                Thread.ResetAbort();
            }

            //expecting for watchWindow: simple, failedReading
            //expecting in regular execution: simple, complex
            return String.Format("{0}, {1}", StringProperty, stringPropertyDebugFail);
        }
    }

    #endregion Properties
}

テストメソッドでのデバッグ:

    [TestMethod]
    public void ReadProperties()
    {
        DummyClassWithDebuglessProperties dummyClassWithDebuglessProperties = new DummyClassWithDebuglessProperties();

        //Create watch for next
        //dummyClassWithDebuglessProperties.AllProperties;

        //breakpoint at the end.
    }

ThreadAbortException は処理されているようですが、Thread.ResetAbort()は Watch Window で式を初期化する必要があるスレッドの回復に成功せず、Catch ブロックを離れると ResetAbort のように再スローされて効果がありません。ブレークポイントに到達したときの監視の最初の評価では、次の状況があります:
画像 - 最初に「安全でない」プロパティを読み取ろうとしました

プロパティの読み取りが要求され、ThreadAbortException が発生したことがわかります。マークの付いたアイコンをクリックすると、「安全でない」読み取りが実行されます。
画像 - ボタンクリック後の通常の読み取り

初期評価に興味があるのですが、
simple、failedReadingなどの評価は可能ですか?

ウォッチ ウィンドウ スレッドでは Thread.ResetAbort() が無視される可能性があります。何か案は?

参考になる関連トピック:
デバッグ中の Visual Studio: 関数の評価では、すべてのスレッドを実行する
必要があります 評価では、一時的にスレッドを実行する必要があります。ウォッチ ウィンドウを使用して評価を実行する

4

0 に答える 0