web-dev-qa-db-ja.com

非同期メソッドの例外でデバッガが中断/停止しない

デバッガーが.NETプロセスに接続されている場合、未処理の例外がスローされると(通常)デバッガーは停止します。

ただし、asyncメソッドを使用している場合、これは機能しないようです。

以前に試したシナリオを次のコードにリストします。

_class Program
{
    static void Main()
    {
        // Debugger stopps correctly
        Task.Run(() => SyncOp());

        // Debugger doesn't stop
        Task.Run(async () => SyncOp());

        // Debugger doesn't stop
        Task.Run((Func<Task>)AsyncTaskOp);

        // Debugger stops on "Wait()" with "AggregateException"
        Task.Run(() => AsyncTaskOp().Wait());

        // Throws "Exceptions was unhandled by user code" on "await"
        Task.Run(() => AsyncVoidOp());

        Thread.Sleep(2000);
    }

    static void SyncOp()
    {
        throw new Exception("Exception in sync method");
    }

    async static void AsyncVoidOp()
    {
        await AsyncTaskOp();
    }

    async static Task AsyncTaskOp()
    {
        await Task.Delay(300);
        throw new Exception("Exception in async method");
    }
}
_

何か不足していますか? AsyncTaskOp()の例外でデバッガをブレーク/停止させるにはどうすればよいですか?

55

Debugメニューで、Exceptions...。 [例外]ダイアログの[Common Language Runtime ExceptionsThrownボックスをチェックします。

35
Stephen Cleary

誰かがこの問題を回避する方法を見つけた場合、私は聞きたいですか?おそらく、最新のビジュアルスタジオの設定...?

厄介だが実行可能なソリューション(私の場合)は、独自のcustom Exceptionをスローし、Stephen Clearyの答えを修正することでした。

[デバッグ]メニューで[例外]を選択します(このキーボードショートカットを使用できます Control + Alt + E)... [例外]ダイアログで、[共通言語ランタイムの例外]行の横にある[スロー]ボックスをオンにします。

具体的には、リストにcustom Exceptionを追加し、[スロー]ボックスにチェックマークを付けます。

例えば:

async static Task AsyncTaskOp()
{
    await Task.Delay(300);
    throw new MyCustomException("Exception in async method");
}
3
Jimbob