非同期コードを理解するにはどうすればよいですか?

こんにちは、Habr!「非同期コードについてどう思いますか?!」という記事の翻訳(若干の修正を加えたもの)をお知らせします。レスリー・リチャードソン著。



非同期コードは、応答性の高いアプリケーションを作成するためにますます一般的になっています。残念ながら、非同期プログラミングではさらに問題が発生します。結果として、そのようなコードがどのように機能するかを理解することは、あなたの経験に関係なく、困難な作業になる可能性があります。非同期コードを使い始めたばかりの場合、または理解を深めたい場合は、これが非同期プログラミングの世界の紹介です。



非同期コードとは何ですか?



非同期プログラミングを使用すると、アクションが実行されているスレッド全体を停止(またはブロック)することなく、コードのブロックを実行できます。非同期コードに関する一般的な神話は、パフォーマンスが向上するというものですが、これは常に正しいとは限りません。代わりに、非同期プログラミングの主な機能は、これらのアクションが実行されるスレッドをブロックすることなく、同時に実行できるタスクの数(帯域幅)を増やすことです。



非同期コードはマルチスレッドコードに非常に似ていると思うかもしれません。結局のところ、両方の場合で多くのメソッドを同時に実行できます。実際、非同期プログラミングは、シングルスレッドアプリケーションとマルチスレッドアプリケーションの両方で使用できます。これは、1つのスレッドが並列タスクを実行できるシングルスレッドの非同期プログラムを持つことができることを意味します。逆に、複数のスレッドが複数の並列タスクを実行できるマルチスレッド非同期アプリケーションを作成することもできます。



なぜ非同期コードを使用する必要があるのですか?例をお願いします!



非同期プログラミングを示すためのいくつかの類似点を持たせるために、パイを焼くプロセスを考えてみましょう。このプロセスは、以下のコードに示すように、いくつかのステップ(またはタスク)を実行するスレッドによって表されます。このコードは正しく、メソッドの実行後もおいしいケーキがあります。ただし、すべてのコードが同期しているため、各行は順番に実行されます。つまり、オーブンの予熱が終了するのを待つ間、完全に静止します。しかし同時に、あなたはあなたのパイのために生地を作ることができました!



同期MakeCake()メソッド



画像



同期ケーキベーキングプログラム



画像



実生活では、このプロセスをタスクに分割し、オーブンが加熱されている間に生地をこねる傾向があります。または、パイをオーブンで焼きながらアイシングを行います。これにより生産性が向上し、ケーキをより速く焼くことができます。ここで非同期コードが役に立ちます!現在のコードを非同期にすることで、オーブンでパイを焼くなどタスク結果待つ間に時間を渡すために他のことを行うことができます これを行うには、コードを変更し、PassTheTimeメソッドを追加します。これで、コードはタスクの状態を保存し、別の同期または非同期操作を開始し、必要に応じて保存されたタスクの結果を取得します。





非同期MakeCake()

画像



非同期ケーキベーキングプログラム

画像



同期に比べMakeCakeの方法欠け、PassTheTimeの方法は、非同期MakeCakeAsyncの方法は、それが全体の方法を完了するのにかかる時間を短縮スレッドをブロックせずに複数のタスクを完了することができます。



非同期プログラムと同期プログラムの比較



画像



.NETで非同期コードを作成するにはどうすればよいですか?



C#を使用すると、Taskタイプawaitおよびasyncキーワードを使用して非同期コードを記述できますタスクタイプは、呼び出し元に可能なリターンタイプを通知します。また、呼び出し元のメソッドで他のアクションを引き続き実行できることも示しています。非同期キーワードはとペアになっているのawaitキーワードではなく、すぐに、私たちはメソッドの戻り値を必要とすることをコンパイラに通知し、。その結果、呼び出し元のスレッドをブロックする必要がなく、期待される値が必要になるまで他のタスクを実行し続けることができます。最初は非同期メソッドは、awaitキーワードが見つかるまで同期的に実行されます..。これはまさに、メソッドの実行が非同期で開始される瞬間です。



非同期コードについて学びました!それで?



非同期ケーキベーキングアプリケーションは素晴らしいですが、非同期コードを使用する他の多くの実際のアプリケーションもあります。最も一般的な2つの例は次のとおり



です。HTTPリクエストを使用するアプリケーション-リクエストによっては、HTTP呼び出しの処理に時間がかかる場合があります。非同期コードを使用すると、サーバーからの応答を待つ間に他の操作を実行できます。



HTTPGETリクエストの例



画像



UIアプリケーション-WPFアプリケーション、またはボタン、テキストボックス、その他のUXリソースを使用するその他のアプリケーションも、非同期実装に最適です。たとえば、ファイルを解析するWPFアプリケーション。この手順には時間がかかる場合があります。ただし、このアクションを非同期にすることで、操作の完了を待つ間、アプリケーションを完全に停止することなく、ユーザーインターフェイスを操作できます。



All Articles