C#非同期・並列プログラミング入門
シーシャープ ヒドウキ ヘイレツ プログラミング ニュウモン
なぜ注目されているか
技書の森解説
『C# 非同期・並列プログラミング入門』 (北山 洋幸 著、カットシステム、2022 年 10 月刊) は、C# の並列処理と非同期処理を、Task クラスと async/await、UI スレッドへの Invoke を軸に解説する本です。版元の書籍ページでは、書名に「Task、async/await、Invoke の要諦を学ぶ」が添えられています。版元は、並列処理は性能の向上を目的にすることが多いものの、本書はユーザーインターフェース (UI) の改善にも多くの紙幅を割いたと案内しており、async/await に絡むデッドロックや例外の捕捉もまとめています。
全 7 章の構成、並列と非同期の概論から Parallel クラスまで
第 1 章「並列と非同期概論」は逐次と並列、プロセスとスレッドによる並列、並列化する目的と課題、タスク並列ライブラリ (TPL) の概論を扱います。第 2 章「並列処理」でスレッドの基本からタスク配列、タスク継続、入れ子タスクと子タスクへ進み、第 3 章「Task と非同期」では同期処理と非同期処理の違い、画面がフリーズする例、Task の Wait メソッドと非同期の関係、非同期プログラミングのガイドラインを取り上げます。第 4 章「Task と UI 更新」は Invoke、BeginInvoke、InvokeAsync による UI の更新と、BackgroundWorker や Queue クラスを使って頻繁に UI を更新する方法を比べ、第 5 章「Task と例外」は async/await と Wait での例外の捕捉、捕捉できない例外、複数のタスクの例外を扱います。第 6 章「排他処理」は Interlocked、Monitor、lock 文、AutoResetEvent、Mutex、Semaphore の各クラスとコンカレントコレクション、第 7 章「Parallel クラス」は Parallel.For と Parallel.ForEach、ループの脱出と取り消し、Partitioner クラス、Parallel.Invoke です。付録は「Visual Studio のインストール」と「プロジェクト作成」の 2 本です。
Task と async/await、UI スレッドという語
Windows のデスクトップアプリケーションでは、画面の部品を更新できるのは UI スレッドだけです。Task は スレッドプール の上で処理を動かす単位で、async/await はその完了を待つ間に UI スレッドを解放する 非同期プログラミング の構文です。第 4 章は Invoke などで UI スレッドへ処理を渡して画面を更新する方法を、第 5 章は例外の捕捉を await した場合と Wait で待った場合に分けて扱います。
共有データを守る排他処理と、性能のための並列化
排他処理は、複数の スレッド が同じ変数やコレクションを同時に書き換えないようにする処理です。第 6 章は、Interlocked による不可分な操作、lock 文と Monitor、ミューテックス やセマフォによる排他、ロックを内部で受け持つコンカレントコレクションを扱います。第 7 章の Parallel クラスは、ループの各回を複数のスレッドに割り振って処理時間を縮める性能のための並列化で、版元の案内では TPL が C# 4.0 と .NET Framework 4 で加わり、async/await は C# 5.0 で導入されたと説明しています。
本書は、Task と async/await の基礎、UI スレッドへの Invoke による画面の更新、デッドロックと例外の捕捉、排他処理、Parallel クラスによる並列化を、全 7 章と付録 2 本に収めています。
この本に興味がある方におすすめ
関連する本
関連記事
DevOps 本ガイド - CI/CD とインフラ自動化を学ぶ技術書の選び方
DevOps の文化と原則から CI/CD、IaC、オブザーバビリティまで学べる技術書の選び方と学習順序を紹介します。
技術書の速読術 - 必要な情報を素早く見つける読み方
技術書の速読は「文字を速く読む」ことではなく「読まなくていい部分を見極めて飛ばす」こと。目的別の読み方と速読の 5 ステップを紹介します。
本を読むスピードは気にしなくていい
1 ページ読むのに 10 分かかっても問題ありません。プログラミングの本はゆっくり読むのが正解である理由と、焦らず読み進めるコツを紹介します。
関連用語
プロパティベーステスト
ランダムな入力を大量に生成し、プログラムの不変条件が常に成り立つことを検証するテスト手法
入力バリデーション
ユーザー入力を検証し、不正なデータがシステムに入り込むのを防ぐセキュリティの基本
競技プログラミング
与えられた問題を制限時間内に正確 / 高速に解くプログラミング競技
依存グラフとは - モジュール間の依存関係を可視化する方法
依存グラフはパッケージやモジュール間の依存関係を有向グラフで表現する手法。循環依存の検出 / ビルド順序の決定 / 影響範囲分析での活用法を解説
純粋関数
同じ入力に対して常に同じ出力を返し、副作用を持たない関数
グラフアルゴリズム
ノードとエッジで構成されるグラフ構造に対する探索 / 最短経路 / 接続性の分析アルゴリズム