17章非同期言語機能

 C#は、非同期メソッドの使用と実装を言語レベルでサポートしています。多くの場合、非同期APIは特定のサービスを利用するための最も効率的な方法です。例えば、ディスクコントローラやネットワークアダプタなどの周辺機器のほとんどは処理の大部分を自律的に実行できるため、ほとんどのI/O処理はOSカーネルの内部では非同期で処理されます。CPUが必要になるのは、操作の開始時と終了時だけです。

 OSが提供しているサービスの多くが本質的には非同期であるにもかかわらず、たいていの場合には開発者は同期API(つまり、処理が完了するまでは戻らないAPI)経由でサービスを利用します。そうするとI/Oの完了までスレッドがブロックされるため、リソースの無駄遣いになってしまいます。スレッドにはオーバーヘッドがあり、最高のパフォーマンスを得るには通常はOSスレッドが比較的少数であるのが最適です。アプリケーションでハードウェアスレッドと同数のOSスレッドを使うのが理想的ですが、これが最適なのは実行すべき未処理の作業がない場合にだけスレッドをブロックできる場合だけです(「16章 マルチスレッド」でOSスレッドとハードウェアスレッドの違いを説明しています)。同期APIを呼び出してブロックされているスレッドの数が多くなるほど、作業に対処するために必要なスレッドも多くなるので、効率が低下します。パフォーマンスが重視されるコードでは非同期APIが役に立ちます。非同期APIであれば、I/Oが完了するまでスレッドを強制的に待機させてリソースを浪費するのではなく、スレッドで処理を開始し、その間に別の生産的な作業を実行できます。

 しかし、非同期APIには同期APIと比較すると使用方法がかなり複雑だという問題点があります。特に顕著なのは、関連する複数の処理を調整し、エラー処理を行わなければならない場合です。そのため、主流のプログラミング言語が組み込みのサポートを用意する以前には多くの開発者があまり効率のよくない同期APIを選択することが多かったのです。2012年にC#とVBでこのような機能を研究段階から脱却させ、それ以来多くの他の人気言語が類似の機能を追加しました(最も顕著なのがJavaScriptで、2016年に非常に見た目の似た構文を導入しました)。C#の非同期機能では、効率的な非同期APIを使い、簡単な同期APIを使った場合とほとんど同じくらい簡潔なコードを書くことができます。 ...

Get プログラミングC# 第8版 now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.