参考資料
[スレッドプールとタスク ++C++; // 未確認飛行 C]
(https://ufcpp.net/study/csharp/misc_task.html)
###同期処理とは
- 処理が文字通り順番に処理されていく
- 一つの処理が終わるまで次の処理に移ることができない
###非同期処理とは
- 処理が順番に処理されていかない
- 一つの処理を行っている最中、他の処理を行うことができる
##非同期処理の種類
ここでは同期処理のやり方は省きます。
非同期学ぶ方は既にご存知だと思うので。
###詳細
#####1.スレッド(Thread)
CPUでよく聞くスレッドと同じもの
既定値は各パソコンのCPUのコア数と同じ。
スレッドは規定値よりも多くのスレッドを生成することが難しい(または遅延が発生する)為、
スレッドを用いた非同期処理ができる量は限られている。
Thread.Thread(ThreadStart start) // クラスの新しいインスタンスを初期化
delegate void system.Threading.ThreadStart() // 実行するメソッドを表すThread
#####2.タスク(Task)
タスク = やること(日本語訳)
タスクはスレッドと違い制限がない
スレッド数を気にせず多くの非同期処理を実装することが可能
Task Task.Run(Action action) // スレッドプール上で実行する指定された作業をキューに配置
スレッドプールとは:
幾つかのスレッドを予め生成しておき、
一度作ったスレッドを可能な限り使いまわすような仕組みのこと。
タスクが限りなく多くの非同期処理を行うことができる理由。
キューとは:
限りあるスレッドに対して幾つかのタスクをリスト化し、並べているものである。
#タスクとスレッドどっちがいいの?
使い方にもよると思うけど、タスクの方が柔軟性は高いんじゃないかなと思います。
#####例えば一時処理を停止する時:
- スレッド
スレッド自体を止めてしまうため、中断中のスレッドが一つ丸ごと指定されたミリ秒の間使用不可となる。
Thread.Sleep(1000); // 指定したミリ秒の間現在のスレッドを中断します。
- タスク
Task.Delay()の下にある処理を遅延後に実行されるタスクとして作成。
そして再びタスクとしてキューへ入れるため、この遅延している間は他のタスクが処理することが可能。
Task.Delay(1000); // 遅延後に完了するタスクを作成します。
これだけでもタスクの方が便利であるということが言えると思います。 でもスレッドしかできないこともあるよ?っていうものがありますが、今回は割愛。 今度解説します