非同期/私たちの残りのための待機
注意:See canonical post at my blog
どのような取引
おそらくあなたは
私は、例えば、使っている難しい方法を理解しなければなりませんでした
しかし、これは2008年の内部の詳細な観察でありません
これは“非同期/私たちの残りのための待機”です.誰が私たちの残りですか?
我々 使用したことがないかもしれない マイクロソフトGurus はC 確かに使用方法を忘れて Googleに戻る必要がありますし、方法を返す方法を理解する必要があります なぜ、マークされていないメソッドが これは、私たちの残りの部分のための記事は、ポイントと実用的です.
あなたがこの話題に掘り下げたいならば、より良い出発点はそうですI'd suggest starting with this article.
なぜasync ?
使用の利点は何ですか
Web開発者向け
を使用するWebアプリケーションを構築する場合.ネット技術-答えは簡単です:スケーラビリティ.
IO呼び出しを行うとき-データベースクエリ、ファイル読み込み、HTTPリクエストからの読み込みなど-現在のHTTPリクエストを処理しているスレッドは待機しています.
それです.それはちょうど結果がオペレーティングシステムから戻ってくるのを待っています.
データベースクエリを実行すると、最終的には、オペレーティングシステムにデータベースに接続してメッセージを送信し、リターンにメッセージを取得します.しかし、それはあなたのアプリではなく、これらの要求を作るのOSです.
IOは時間がかかる.待ち行列(あなたのアプリで)が他のものをするのに用いられることができた時間-特に他のHTTP要求を取り扱うこと.
デスクトップアプリケーション
しかし、デスクトップアプリケーションはHTTPリクエストを処理しません.
まあ、デスクトップのアプリは、ユーザーの入力(キーボード、マウスなど)、アニメーションなどを扱うことがあります.
ユーザ入力はユーザ入力です
我々は、Webアプリケーション内のHTTP要求は、ユーザーの入力だけであり、デスクトップ(またはAPP)のキーボードとマウスのイベントは、ユーザーの入力です-それは実際にデスクトップ/アプリの開発者のために悪いです!彼らは、ユーザ入力を扱う1つの糸だけを得ます!
IOの問題と修正プログラムはまだ適用されます.
しかし、CPUの集中的なタスクの問題は別の懸念です.一言で言えば、これらのタイプのタスクはUIスレッドでは行われません.
タスクの種類は以下のようになります. ループ内の多数の項目を処理する 報告のための計算集約 あなたのアプリがこれを行う(メイン/UIスレッドで)場合は、ユーザー入力とアニメーションのようなUIのものを処理する何もありません.
これは、フリージングとlaggyアプリにつながる.
ソリューションは、CPUの集約タスクをバックグラウンドタスク/スレッドにoffloadすることです.これは、新しいスレッド/タスクをキューに入るには
asyncキーワード
を見始めましょう
asyncキーワードに混乱があります.なぜ?それが見えるので、あなたのメソッドを非同期にします.だが、そうではない.
それは混乱です.The
それでは何をしますか.
すべて
だから、ただの
WAITキーワード
The
一般的に、最も一般的な使用法
ときに
ビジュアルガイドとして考えてみましょう.
では、どのようなメソッドを非同期にするのですか?
まあ-それはない
を返すメソッド
実際に他のwaitablesタイプがあります.また、“wait”メソッドは、非同期メソッドである必要はありません.しかし、それを無視してください-これは「我々の残り」のためのものです
この記事の目的のために、我々は「非同期メソッド」が戻るメソッドであると仮定します
これはいつ起こるのですか.
いつ私たちはAを返す必要がありますか
例えば、
すべての方法で非同期
このようなことをすることは可能です
これを行うことができます-非同期メソッドを呼び出すが、待機しないメソッドを作成します.
最高の練習だ
しかし、これは悪い習慣と見なされます.なぜ?
この記事はポイントと実用的なものになっているので
Async/Waitを使用して“すべての方法をダウン”単に非同期メソッドの例外をキャプチャします.
を返します
結論
要約する The メソッドが IOを行うことは常にスレッドをブロックすることになります.これは、あなたのWebアプリは、並列かつ凍結し、ラグのアプリで多くのHTTPリクエストとして処理できないことを意味します. 使用 これは、より多くの要求を処理することができますWebアプリには、2番目のアプリとより多くのユーザーのための応答です. 私は、これが理解できる導入であることを望みます
多くのより多くの概念は、周囲の多くの概念と言われる 何が アバウト.ネットコアvs .NET Framework -私が認識するべき違いがありますか? なぜ私はメソッドをマークできますか どのように、私はバックグラウンド糸/タスクにCPU集中的な仕事を無効にしますか? バックグラウンドスレッドで作業を行い、最後のスレッドでUIスレッドに戻ることは可能ですか? どのようにしてマークされたメソッドを呼び出しますか 私はあなたが何を考えて知っている-または私は何かを逃した場合など感謝!
連絡を取り合う
または私と接続することを忘れないでください!
あなたのソフトウェア開発経歴を操縦すること
電子メールニュースレターどこで私はサブスクリプションの質問に答えて、トピックの周りのアドバイスを提供します.
✔ ソフトウェア開発者の一般的な段階は?
✔ どのように、私はどのステージを知っていますか?どうやって次のステージに行けますか?
✔ どのような技術リーダーとどのように1つになるのですか?
面白いですか?Join the community!
どのような取引
async
and await
Cでは?なぜでしょう.2018年のネット開発者はそれが何であるかを知る必要があります.おそらくあなたは
async/await
しかし、自分が戻って再びそれを把握する必要がありますか?それはOK -私は明らかにではないasync/await
どちらか.私は、例えば、使っている難しい方法を理解しなければなりませんでした
ConfigureAwait(false).GetResult()
(多くのことが示唆するように)同期的にasyncメソッドを"work "と同期させることはありません.しかし、これは2008年の内部の詳細な観察でありません
async/await
とファンシーを得る方法async/await
.これは“非同期/私たちの残りのための待機”です.誰が私たちの残りですか?
我々
async/await
async/await
適切に時々.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スレッドでは行われません.
タスクの種類は以下のようになります.
これは、フリージングと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を使用して“すべての方法をダウン”単に非同期メソッドの例外をキャプチャします.
を返します
Task
とasync
キーワード-順番に有効にするawait
キーワード-それは例外を処理し、例外のメッセージとスタックトレースを見て理解することができます.結論
要約する
async
キーワードはメソッドを非同期にしませんawait
キーワード.Task
or Task<T>
そして、await
我々のコードの非同期の詳細を管理するキーワード.async/await
私たちは私たちのスレッドがブロックを停止し、有用な作業を行うことを許可するコードを作成するのに役立ちます.async/await
. これは簡単なトピックではない-として、常に-この機能を使用して経験を積む、時間をかけて、何が起こっているかを理解するのに役立ちます.多くのより多くの概念は、周囲の多くの概念と言われる
async/await
. 以下を含みます:SynchronizationContext
? 私はいつこのことを知っているべきですか.async void
? これは何ですか.これを行うべきですか.async
同期コードからキーワード?私がこれをするとき、何が起こりますか?連絡を取り合う
または私と接続することを忘れないでください!
あなたのソフトウェア開発経歴を操縦すること
電子メールニュースレターどこで私はサブスクリプションの質問に答えて、トピックの周りのアドバイスを提供します.
✔ ソフトウェア開発者の一般的な段階は?
✔ どのように、私はどのステージを知っていますか?どうやって次のステージに行けますか?
✔ どのような技術リーダーとどのように1つになるのですか?
面白いですか?Join the community!
Reference
この問題について(非同期/私たちの残りのための待機), 我々は、より多くの情報をここで見つけました https://dev.to/jamesmh/asyncawait-for-the-rest-of-us-c8aテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol