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