非同期メソッドでの奇妙なデバッガーの動作

Altav1sta

コード内のブレークポイントをステップオーバーすると、デバッガーの奇妙な動作に遭遇しました。

public async Task DoSomeWork()
{
     await Task.Run(() => { Thread.Sleep(1000); });

     var test = false;
     if (test)
     {
          throw new Exception("Im in IF body!");
     }
}

デバッガーがif本体に入ります。例外が実際にはスローされないが、そのように見えることは注目に値します。したがって、ブレークポイントをに直接配置すると、それを再現することはできませんthrowあなたはそれを上に置き、それifを捕まえるために体に降りなければなりません同じことが、あらゆる種類の例外インスタンス(nullおよび明示的)で機能しreturnthrow。の代わりでも機能します

それに加えて、で行を削除しても機能しawaitます。

このコードスニペットをさまざまなPCから実行しようとしたので、PCの問題は発生しません。また、VSコードのバグだと思って、JetBrainsのRiderで実行しようとしました。同じ結果です。

私はそれが非同期のものであると確信していますが、それが明示的にどのように機能するのですか?

ピーター・ドゥニホ

コードは、Visual Studio 2015を使用して、「デバッグ」ビルドで問題を簡単に再現します。をProgram.Main()呼び出してDoSomeWork().Wait();、メソッドにブレークポイントを設定し、ステップスルーするだけで、問題を再現できます。

なぜそれが起こるのかというと、これは間違いなく、async書き直されているメソッドと生成されたデバッグデータベース(.pdb)の組み合わせによるものですイテレータメソッドと同様に、メソッドに追加asyncすると、コンパイラはメソッドをステートマシンに変更します。生成される実際のILは、元のメソッドに少しだけ似ています。つまり、それを見ると、元のコードの主要なコンポーネントを識別できますがswitch、メソッドが各awaitステートメントで返されるときに何が起こるかを処理する大きなステートメントになり、それぞれの完了とともに再入力されます待望の表現。

プログラムステートメントがにあるように見える場合throw、それは実際returnにはメソッドの暗黙のステートメントにあります。実行可能ファイルのデバッグデータベースがその行のプログラムステートメントを提供していないだけです。

デバッグするとき、それが起こっているというヒントがあります。ifステートメントをステップオーバーすると、ステートメントに直接移動することがわかりますthrow場合ifのステートメントブロックがされた本当に入力され、次のプログラム文の行は、実際にブロックではなく、プログラム文の開口部のブレースだろう。

たとえばConsole.WriteLine()、メソッドの最後にa追加することもできます。これにより、デバッガーに同期するのに十分な情報が提供され、間違った行番号で表示されなくなります。

方法の詳細についてはasync方法は、コンパイラによって処理され、参照は、新しいC#の非同期機能は、コンパイラで厳密に実装されている、とのリンクがそこには、(トピックに関する記事のJonのシリーズを含む)が得られました。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

非同期メソッドでの予期しない動作

分類Dev

異なるJavaバージョンでの奇妙なデフォルトメソッドの動作

分類Dev

奇妙な非同期コードの動作

分類Dev

ほぼ同じメソッドで異なる動作の非同期/待機

分類Dev

VB.netでの奇妙なデバッガの動作

分類Dev

toLocaleString()メソッドの奇妙な動作

分類Dev

Wcfメソッドの奇妙な動作

分類Dev

.hover()メソッドの奇妙な動作

分類Dev

非同期メソッドでコードをデバッグできないのはなぜですか?

分類Dev

非同期メソッドでコードをデバッグできないのはなぜですか?

分類Dev

非同期メソッドでコードをデバッグできないのはなぜですか?

分類Dev

メソッドのオーバーライドと奇妙な動作

分類Dev

メソッドでの演算子「is」の非常に奇妙な動作

分類Dev

文字列EndsWithメソッドのEntityFrameworkLinqでの奇妙な動作

分類Dev

どのようにJavaの非同期に動作しますか?非同期メソッドは非同期で実行していないようです

分類Dev

Swiftプロトコルメソッドでの奇妙な動作

分類Dev

属性とメソッドでattrgetterとmethodcallerを使用してソートするときの非同期動作

分類Dev

VS C#デバッガーで一見奇妙な動作

分類Dev

非同期で動作するHikariデータソースのバッチ更新を含むSpring JDBCTemplate

分類Dev

ノードの奇妙なユーザー入力非同期動作

分類Dev

メソッドをオーバーライドしようとするときの奇妙なEclipseの動作

分類Dev

ForEachメソッド後のPowerShellの長さの奇妙な動作

分類Dev

非同期メソッドの同期バージョン

分類Dev

WPF Dispatcher.InvokeAsync()非同期デリゲートでの奇妙な動作

分類Dev

メソッドのオーバーロードにおける奇妙なJava null動作

分類Dev

Javaの静的メソッド内のこの奇妙な動的メソッドディスパッチ動作は何ですか

分類Dev

文字列のmatches()メソッドの奇妙な動作

分類Dev

Javascriptの「スプライス」メソッドの奇妙な動作

分類Dev

奇妙なSQLiteの動作-機能しないUPDATESQLiteメソッド

Related 関連記事

  1. 1

    非同期メソッドでの予期しない動作

  2. 2

    異なるJavaバージョンでの奇妙なデフォルトメソッドの動作

  3. 3

    奇妙な非同期コードの動作

  4. 4

    ほぼ同じメソッドで異なる動作の非同期/待機

  5. 5

    VB.netでの奇妙なデバッガの動作

  6. 6

    toLocaleString()メソッドの奇妙な動作

  7. 7

    Wcfメソッドの奇妙な動作

  8. 8

    .hover()メソッドの奇妙な動作

  9. 9

    非同期メソッドでコードをデバッグできないのはなぜですか?

  10. 10

    非同期メソッドでコードをデバッグできないのはなぜですか?

  11. 11

    非同期メソッドでコードをデバッグできないのはなぜですか?

  12. 12

    メソッドのオーバーライドと奇妙な動作

  13. 13

    メソッドでの演算子「is」の非常に奇妙な動作

  14. 14

    文字列EndsWithメソッドのEntityFrameworkLinqでの奇妙な動作

  15. 15

    どのようにJavaの非同期に動作しますか?非同期メソッドは非同期で実行していないようです

  16. 16

    Swiftプロトコルメソッドでの奇妙な動作

  17. 17

    属性とメソッドでattrgetterとmethodcallerを使用してソートするときの非同期動作

  18. 18

    VS C#デバッガーで一見奇妙な動作

  19. 19

    非同期で動作するHikariデータソースのバッチ更新を含むSpring JDBCTemplate

  20. 20

    ノードの奇妙なユーザー入力非同期動作

  21. 21

    メソッドをオーバーライドしようとするときの奇妙なEclipseの動作

  22. 22

    ForEachメソッド後のPowerShellの長さの奇妙な動作

  23. 23

    非同期メソッドの同期バージョン

  24. 24

    WPF Dispatcher.InvokeAsync()非同期デリゲートでの奇妙な動作

  25. 25

    メソッドのオーバーロードにおける奇妙なJava null動作

  26. 26

    Javaの静的メソッド内のこの奇妙な動的メソッドディスパッチ動作は何ですか

  27. 27

    文字列のmatches()メソッドの奇妙な動作

  28. 28

    Javascriptの「スプライス」メソッドの奇妙な動作

  29. 29

    奇妙なSQLiteの動作-機能しないUPDATESQLiteメソッド

ホットタグ

アーカイブ