【C#】async awaitを用いた非同期処理-役立つサイトまとめ-

# 概要
async awaitを用いた非同期処理に関するまとめ。
二番煎じ（?)感はありますが、目的に応じた情報にジャンプできるようにまとめた(つもりです)。

# 目次

* [想定読者](#想定読者)
* [ポイントだと思うこと](#個人的にポイントだと思うこと)
* [初学者向けの情報](#非同期処理の知識がない人向け)
* [リソース開放について](#リソース開放について)
* [中断方法](#非同期処理の中断方法)
* [例外キャッチ](#非同期処理の例外キャッチ)
* [イディオム](#イディオム)
* [単体テスト](#単体テスト)
* [リファクタリングの指針](#リファクタリングの指針)
* [async/awaitのしくみ](#asyncawaitのしくみ)
* [非同期ライブラリの実装ガイドライン](#非同期ライブラリの実装ガイドライン)


# 想定読者
①これからC#の非同期処理を学ぶ人。
②非同期処理は理解しており、目的に応じた情報を探したい人

# 個人的にポイントだと思うこと
①async awaitは[処理を非同期に行う仕組み]ではなく、「非同期処理を待つための仕組み」である。
②async awaitは簡単に事故を起こします。「ベストプラクティス」を覚えましょう。

--------------------------------------------------------

# 非同期処理の知識がない人向け

## 1.async および await を使用した非同期プログラミング
「非同期処理」の概念は知らない人はこちらから！
[MS社：async および await を使用した非同期プログラミング](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/async/ "async および await を使用した非同期プログラミング")

## 2.非同期プログラミング モデル　-非同期メソッドでの動作-
非同期メソッドが「どんな順番で実行されるか」を図解している。図を見ながらステップ実行すると理解が早くなると思います。
[MS社：非同期メソッドでの動作](https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/async/task-asynchronous-programming-model "非同期メソッドでの動作")

## 3.[Unite Tokyo2018]さては非同期だなオメー！async awaitを完全に理解しよう
ゲームエンジンUnityの講演。async awaitの仕組みをわかりやすく解説してます。
C#言語共通部分は25分ぐらいまで、そこまで観ればOKです。
[youtube:さては非同期だなオメー！async/await完全に理解しよう](https://www.youtube.com/watch?v=yBNFQfviKQY&t=76s)

## 4.An other world awaits you
スレッドプール/UIスレッド/同期コンテキストの話がコンパクトに纏まっている。
特に、41~45ページに「同期コンテキスト」って言葉は頭の片隅に置いた方が良い。
普段は意識する必要ないけど、デットロックなど問題が起きたときに向き合う羽目になる。
[An other world awaits you](https://www.slideshare.net/ufcpp/an-other-world-awaits-you "An other world awaits you")

## 5.async/awaitと同時実行制御
4.のスライド知識を前提に、awaitの内部動作と同期コンテキストの関連について解説してます。
1~4を見た上で余力あれば、ぜひ！！
[async/awaitと同時実行制御](
https://ufcpp.wordpress.com/2012/11/12/asyncawait%E3%81%A8%E5%90%8C%E6%99%82%E5%AE%9F%E8%A1%8C%E5%88%B6%E5%BE%A1/ "async/awaitと同時実行制御")

--------------------------------------------------------
# 非同期処理の知識がある人向け

## リソース開放について
TaskクラスはIDisposable()を継承していますが、Dispose()で破棄する必要はありません。
下記サイトの注釈に「呼ぶ必要ない」と記載されている。
[Task.Dispose()](https://docs.microsoft.com/ja-jp/dotnet/api/system.threading.tasks.task.dispose?view=net-5.0 "Task.Dispose()")

## 非同期処理の中断方法
ポイントはキャンセルトークンを渡すこと。
[タスクのキャンセル](https://docs.microsoft.com/ja-jp/dotnet/standard/parallel-programming/task-cancellation "MS社：タスクのキャンセル")

## 非同期処理の例外キャッチ
[async／awaitで例外処理をするには？](https://www.atmarkit.co.jp/ait/articles/1805/16/news018.html "async／awaitで例外処理をするには？")

## イディオム

### 1.非同期プログラミングのベスト プラクティス@2013
非同期プログラミングの指針と詳細な説明がある。やや古いがすごく参考になる。
[MSDNマガジン:非同期プログラミングのベスト プラクティス](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming)

### 2.MS社の公式ページにあるイディオム
下記サイトの「重要な情報とアドバイス」を参照のこと。
1.MSDNマガジンのイディオム＋αの重要な情報が記載されている。
[重要な情報とアドバイス](https://docs.microsoft.com/ja-jp/dotnet/csharp/async)

### 3.Correcting Common Async Await Mistakes in .NET@2019
MS社エバンジェリストBrandon Minnickさんの講演(NDC Conference@2019)
page21-27にBest Practisの記載あり

[SlideShare](https://www.slideshare.net/secret/M1kWxIKW7q20ku)
[講演動画](https://www.youtube.com/watch?v=J0mcYVxJEl0&t=144s)

https://www.slideshare.net/secret/M1kWxIKW7q20ku

## 単体テスト
下記記事に単体テスト方法と単体テストを容易にする方法が提示されている。
[MSDNマガジン：非同期コードの単体テスト: テストを容易にする 3 つの解決策](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2014/november/async-programming-unit-testing-asynchronous-code-three-solutions-for-better-tests)

## リファクタリングの指針
### 非同期プログラミング - 非同期への変換
同期処理から非同期処理に変換する手順が書かれています。
[MSDNマガジン：非同期プログラミング - 非同期への変換](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2015/july/async-programming-brownfield-async-development)

### スタートアップから非同期にする方法
async-awaitを使うと、呼び出し元も非同期になり、芋づる的に非同期関数が増えていく。
「はじめから非同期にするにはどうするべきか？」を書いた記事。
Windows フォームと WPFの既定の UI スタートアップ コードのリファクタリングを行い、
async/await のサポートを追加する一連の手順が記載されている。

[MSDNマガジン:スタートアップから非同期にする方法](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2015/november/asynchronous-programming-async-from-the-start)

サンプルコード(上手くリンクされなかったら、別タブでURLコピー貼付けしてください。)
http://download.microsoft.com/download/b/a/e/baea7711-903c-4536-92ff-cac9955eb848/code_sowul.async.1115.zip


## async/awaitのしくみ
内部の仕組みに興味ある人向け

わかりやすいと思った順
### 1.C#のasync/awaitの内部挙動を理解する
async awaitがステートマシン内部的に構築することをわかりやすく説明しているQiita記事。
UIスレッドなどでTask.Wait()を呼び、ブロッキングすることでデットロックが起こる
仕組みをわかりやすく説明している。
https://qiita.com/mrngsht/items/7d280c9f161f6d9855e2

### 2 async awaitの仕組みスライド
岩永さんのページ27からページ41でasync awaitの内部処理を説明している。
[岩永さんのスライド](https://www.slideshare.net/ufcpp/asyncawait-114647813)

### 3 　awaitによる一時停止と再生
さらに深くawaitの仕組みを深堀りしたい人用。
MS社が出している内部処理に関する記事。正直わかりづらい。
[MSDNマガジン:awaitによる一時停止と再生](https://docs.microsoft.com/ja-jp/archive/msdn-magazine/2011/october/asynchronous-programming-pause-and-play-with-await#%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

## 非同期ライブラリの実装ガイドライン

### .NETで非同期ライブラリを正しく実装する
.NETで非同期ライブラリを正しく実装するためのガイドラインが記載されている。
[.NETで非同期ライブラリを正しく実装する](https://www.infoq.com/jp/articles/Async-API-Design/)