非同期/私たちの残りのための待機


注意:See canonical post at my blog
どのような取引async and await Cでは?なぜでしょう.2018年のネット開発者はそれが何であるかを知る必要があります.
おそらくあなたはasync/await しかし、自分が戻って再びそれを把握する必要がありますか?それはOK -私は明らかにではないasync/await どちらか.
私は、例えば、使っている難しい方法を理解しなければなりませんでしたConfigureAwait(false).GetResult() (多くのことが示唆するように)同期的にasyncメソッドを"work "と同期させることはありません.
しかし、これは2008年の内部の詳細な観察でありませんasync/await とファンシーを得る方法async/await .
これは“非同期/私たちの残りのための待機”です.誰が私たちの残りですか?
我々
  • 使用したことがないかもしれないasync/await
  • マイクロソフトGurus
  • はC
  • 確かに使用方法を忘れてasync/await 適切に時々.
  • Googleに戻る必要がありますし、方法を返す方法を理解する必要がありますTask しかし、使用しないasync キーワード.
  • なぜ、マークされていないメソッドがasync それが呼び出し元で待つことができます
  • これは、私たちの残りの部分のための記事は、ポイントと実用的です.
    あなたがこの話題に掘り下げたいならば、より良い出発点はそうですI'd suggest starting with this article.

    なぜasync ?
    使用の利点は何ですかasync/await ?

    Web開発者向け
    を使用するWebアプリケーションを構築する場合.ネット技術-答えは簡単です:スケーラビリティ.
    IO呼び出しを行うとき-データベースクエリ、ファイル読み込み、HTTPリクエストからの読み込みなど-現在のHTTPリクエストを処理しているスレッドは待機しています.
    それです.それはちょうど結果がオペレーティングシステムから戻ってくるのを待っています.
    データベースクエリを実行すると、最終的には、オペレーティングシステムにデータベースに接続してメッセージを送信し、リターンにメッセージを取得します.しかし、それはあなたのアプリではなく、これらの要求を作るのOSです.
    IOは時間がかかる.待ち行列(あなたのアプリで)が他のものをするのに用いられることができた時間-特に他のHTTP要求を取り扱うこと.

    Using async/await allows your .Net web apps to be able to handle more HTTP requests while waiting for IO to complete.



    デスクトップアプリケーション
    しかし、デスクトップアプリケーションはHTTPリクエストを処理しません.
    まあ、デスクトップのアプリは、ユーザーの入力(キーボード、マウスなど)、アニメーションなどを扱うことがあります.

    ユーザ入力はユーザ入力です
    我々は、Webアプリケーション内のHTTP要求は、ユーザーの入力だけであり、デスクトップ(またはAPP)のキーボードとマウスのイベントは、ユーザーの入力です-それは実際にデスクトップ/アプリの開発者のために悪いです!彼らは、ユーザ入力を扱う1つの糸だけを得ます!
    IOの問題と修正プログラムはまだ適用されます.
    しかし、CPUの集中的なタスクの問題は別の懸念です.一言で言えば、これらのタイプのタスクはUIスレッドでは行われません.
    タスクの種類は以下のようになります.
  • ループ内の多数の項目を処理する
  • 報告のための計算集約
  • あなたのアプリがこれを行う(メイン/UIスレッドで)場合は、ユーザー入力とアニメーションのようなUIのものを処理する何もありません.
    これは、フリージングとlaggyアプリにつながる.
    ソリューションは、CPUの集約タスクをバックグラウンドタスク/スレッドにoffloadすることです.これは、新しいスレッド/タスクをキューに入るにはConfigureAwait(false) 非UIコンテキスト上のコードの非同期分岐などを維持するには、記事のスコープを超えてすべてのものを参照してください.

    asyncキーワード
    を見始めましょうasync/await キーワードとどのように使用することです.
    asyncキーワードに混乱があります.なぜ?それが見えるので、あなたのメソッドを非同期にします.だが、そうではない.
    それは混乱です.The async キーワードは私のメソッドを非同期にしませんか?うん.

    それでは何をしますか.
    すべてasync キーワードはWAITキーワードを有効にします.それです.以上です.それは他に何もしない.
    だから、ただのasync キーワードとしてのキーワードenableAwait キーワード.

    WAITキーワード
    The await キーワードは、魔法が起こるところです.基本的に言う(コードの読者に)

    I (the thread) will make sure if something asynchronous happens under here, that I'll go do something else (like handle HTTP requests). Some thread in the future will come back here once the asynchronous stuff is done.


    一般的に、最も一般的な使用法await データベースクエリから取得したり、ファイルからコンテンツを取得したりするときにIOを実行している場合です.
    ときにawait IOを行う方法、それはIOを行うあなたのアプリケーションではない-それは最終的にオペレーティングシステムです.それで、あなたの糸はちょうどそこに座っています..待って.await 現在のスレッドを教えてください.オペレーティングシステムと.NET Framework以降のスレッドを取得します.
    ビジュアルガイドとして考えてみましょう.
    var result1 = await SomeAsyncIO1(); // OS is doing IO while thread will go do something else.
    // A thread gets the results.
    
    var result2 = await SomeAsyncIO2(result1); // Thread goes to do something else.
    // One comes back...
    
    await SomeAsyncIO3(result2); // Goes away again...
    // Comes back to finish the method.
    
    この時点であなた自身を尋ねるかもしれません.

    If the async keyword doesn't make a method asynchronous then what does?



    では、どのようなメソッドを非同期にするのですか?
    まあ-それはないasync 私たちが学んだキーワード.ゴーフィギュア.
    を返すメソッドTask or Task<T> を使用して待つことができますawait キーワード.
    実際に他のwaitablesタイプがあります.また、“wait”メソッドは、非同期メソッドである必要はありません.しかし、それを無視してください-これは「我々の残り」のためのものです
    この記事の目的のために、我々は「非同期メソッド」が戻るメソッドであると仮定しますTask or Task<T> .

    これはいつ起こるのですか.
    いつ私たちはAを返す必要がありますかTask 方法から?通常はIOを行うときです.ほとんどのIOライブラリまたは組み込み.NET APIにはメソッドの"async "バージョンがあります.
    例えば、SqlConnection クラスはOpen 接続を開始するメソッド.しかし、それはまたOpenAsync メソッド.また、ExecuteNonQueryAsync メソッド.
    public async Task<int> IssueSqlCommandAsync() {
        using(var con = new SqlConnection(_connectionString))
        {
            // Some code to create an sql command "sqlCommand" would be here...
            await con.OpenAsync();
            return await sqlCommand.ExecuteNonQueryAsync();
        }
    }
    
    何がOpenAsync and ExecuteNonQueryAsync メソッド非同期async しかし、それは彼らがTask or Task<T> .

    すべての方法で非同期
    このようなことをすることは可能ですasync and await ):
    public Task<int> GetSomeData() {
        return DoSomethingAsync();
    }
    
    それからawait このメソッド
    // Inside some other method....
    await GetSomeData();
    
    GetSomeData への呼び出しを待っていませんDoSomethingAsync - これはTask . 覚えてawait メソッドが使用している場合、気にしないasync キーワード-メソッドを返す必要がありますTask .
    これを行うことができます-非同期メソッドを呼び出すが、待機しないメソッドを作成します.

    最高の練習だ
    しかし、これは悪い習慣と見なされます.なぜ?
    この記事はポイントと実用的なものになっているので
    Async/Waitを使用して“すべての方法をダウン”単に非同期メソッドの例外をキャプチャします.
    を返しますTaskasync キーワード-順番に有効にするawait キーワード-それは例外を処理し、例外のメッセージとスタックトレースを見て理解することができます.

    結論
    要約する
  • The async キーワードはメソッドを非同期にしませんawait キーワード.
  • メソッドがTask or Task<T> そして、await 我々のコードの非同期の詳細を管理するキーワード.
  • IOを行うことは常にスレッドをブロックすることになります.これは、あなたのWebアプリは、並列かつ凍結し、ラグのアプリで多くのHTTPリクエストとして処理できないことを意味します.
  • 使用async/await 私たちは私たちのスレッドがブロックを停止し、有用な作業を行うことを許可するコードを作成するのに役立ちます.
  • これは、より多くの要求を処理することができますWebアプリには、2番目のアプリとより多くのユーザーのための応答です.
  • 私は、これが理解できる導入であることを望みますasync/await . これは簡単なトピックではない-として、常に-この機能を使用して経験を積む、時間をかけて、何が起こっているかを理解するのに役立ちます.
    多くのより多くの概念は、周囲の多くの概念と言われるasync/await . 以下を含みます:
  • 何がSynchronizationContext ? 私はいつこのことを知っているべきですか.
  • アバウト.ネットコアvs .NET Framework -私が認識するべき違いがありますか?
  • なぜ私はメソッドをマークできますかasync void ? これは何ですか.これを行うべきですか.
  • どのように、私はバックグラウンド糸/タスクにCPU集中的な仕事を無効にしますか?
  • バックグラウンドスレッドで作業を行い、最後のスレッドでUIスレッドに戻ることは可能ですか?
  • どのようにしてマークされたメソッドを呼び出しますかasync 同期コードからキーワード?私がこれをするとき、何が起こりますか?
  • 私はあなたが何を考えて知っている-または私は何かを逃した場合など感謝!

    連絡を取り合う
    または私と接続することを忘れないでください!

    あなたのソフトウェア開発経歴を操縦すること
    電子メールニュースレターどこで私はサブスクリプションの質問に答えて、トピックの周りのアドバイスを提供します.
    ✔ ソフトウェア開発者の一般的な段階は?
    ✔ どのように、私はどのステージを知っていますか?どうやって次のステージに行けますか?
    ✔ どのような技術リーダーとどのように1つになるのですか?
    面白いですか?Join the community!