‫お帰りなさい｡
‫このビデオでは､ 脅威プールについて見ていきます｡
‫そこで､ 複数のスレッドを作成して､ 何が起こるかを確認することになります｡
‫したがって､ まず最初に､ 非常に基本的なスレッドを作成し､ この補完ソースのものを取り除くことにしましょう｡
‫そして､ ここは非常に一般的なスレッドになっているわけです｡
‫これまで使ってきた汎用的な糸なんですね｡
‫そしてここでは､ 例えば1/2を待ちます｡ スレッド番号を持ち､ それを起動するためには､ もちろん､ 最後の方にあるstartメソッドを呼び出す必要があります｡
‫これでスレッドが立つだけで､ 始まっちゃうわけですね｡
‫だから､ 何も目新しいことはない｡
‫そこでは何度もやっています｡
‫唯一の違いは､ スレッドプールというものを使いたいのですが､
‫その前に､ enumerableという数字を使って､ 0から100までの範囲をリストにして､
‫それぞれのエントリに対して､ 何かをしたいのですが､ その前に｡
‫だから､ 具体的なコードを実行するだけでいいということです｡
‫つまり､ これはかなり1行のコードに過ぎないのです｡
‫そして､ その中でスレッドを作りたいのです｡
‫つまり､ このI列挙型､ またはこの列挙型は､ 実際には複数のスレッドを作成し､ そのうちの100個を作成することになるのです｡
‫そこで､ ここではリンクを使用することにします｡
‫そのため､ enumerableを使用するためにシステムリンクを使用し､ 最後にEを付けてrangeと呼ぶ必要があります｡
‫そこで､ 私たちは
‫これで100個のスレッドが作成され､ コンソールにそのスレッドがすべて表示されます｡
‫では､ さっそく始めてみましょう｡
‫そして､ そこに私たちはいます｡
‫そしてご覧のように､ スレッドを立ち上げ､ スレッドを終わらせています｡
‫そして102が最後のスレッドです｡
‫そして､ ご覧のように3つから始まりました｡
‫だから､ 3､ 6､ 5､ ......と始まる｡
‫ですから､ ご覧のように順番は私たちの予想と大きく異なっています｡
‫だから､ スレッドは､ 私たちが期待する順序とは異なるIDを持っているのですが､ その後､ スレッドを開始し､
‫終了して､ 少し速すぎたかもしれません｡
‫そこで､ もう少し糸を作ろう｡
‫そこで､ 1000スレッドとすると､ ご覧のように大量のスレッドが作成されますが､ 他のスレッドが開始される前にスレッドが終了してしまうのです｡
‫だから､ この列挙可能なものは､ それを開始したり､ できるだけ早く､ 作成したりします｡
‫でも､ ご覧の通り､ ちょっと時間がかかりますね｡
‫ですから､ 私たちがいるスレッドを作成するのに大体100ミリ秒くらいとすると､ それを作成し､ それを終了させるために開始します｡
‫そのため､ 1/2以降に6つのスレッドが作成され､ その後スレッド5が作成されただけでした｡
‫それで､ 最初の1枚が終了しました｡
‫このようにスレッドを作成するのですが､ あまり効率的ではありません｡
‫そしてそれは､ 糸を扱うときには､ とてもとても慎重に､ そしてとても正確に行わなければならないという､ 糸のとても重要な側面でもあります｡
‫そのスレッドで何をしたいのか､ なぜそのスレッドがあるのか､ スレッドの中にあるすべてのものを一般的にどう扱うのかを知る必要があります｡
‫これはスレッドの例ですが､ 複数のスレッドを作成することができ､ このように1000個のスレッドが作成されました｡
‫スレッドプールとは､ スレッドを使用する際の少し異なるアプローチで､
‫不要なスレッドを1000個も作らないので､ 少し安全性が高いのです｡
‫現在必要とされているスレッドのみを搭載しています｡
‫そこで､ ここにスレッドプールを作成し､ ユーザーのワークアイテムQ Aメソッドをキューに入れ､ 実行することにしましょう｡
‫このメソッドはスレッドプールのスレッドが利用可能になったときに実行されるので､ 利用可能になったときだけ､
‫これが実行され､ ここにオブジェクトが必要です｡
‫つまり､ ここには2種類のものがあるのです｡
‫callbackとobjectがありますが､ objectのようにああしてあげればいいんですね｡
‫ただ､ ここでは特に何もせず､ スレッドプールで実行するものを､ ああ呼ぶことにします｡
‫だから､ スレッドのIDとかスレッド番号とか､ まあ､ いつ始まっていつ終わったかとか､ そういうのを教えてくださいということなんです｡
‫ということで､ このスレッドプールでやりたいことは大体決まっています｡
‫そして､ ここにあるように､ 私たちは特にスレッドを作ったりはしませんが､ スレッドプールがそうしてくれるのです｡
‫だから､ 1000スレッドを処理するような仕事はいくらでもあるのです｡
‫そして､ ご覧の通り､ 特定の量のスレッドしか作成されないのです｡
‫そして､ ご覧のように､ 多かれ少なかれ同時にスレッドを開始し､ 終了します｡
‫また､ CPUは特定の数のスレッドしか同時に処理できないため､ CPUのコア数が多くないこともおわかりいただけると思います｡
‫そのため､ スレッドプールでは､ ご覧のように､ よりスムーズに処理することができます｡
‫しかし､ 当然ながらその1000ものスレッドをすべて消化するのは大変な時間を要します｡
‫しかし､ やはり脅威を利用する場合は､ それをコントロールしなければなりません｡
‫だから､ 無造作に脅迫を使うのはやめましょう｡
‫脅威を利用するのは､ 主にバックグラウンドで何かをするときと､ フォアグラウンドで何かをするときです｡
‫つまり､ フォアグラウンドには通常､ UIのようなものがあるわけです｡
‫WPFを使う場合､ あるいはXamarinでアプリを使う場合､ あるいはXamarinでアプリを作る場合､
‫フロントエンド､ つまりUIで起きていることはすべてメインスレッドで行われ､ その後､ ビデオのダウンロードやインターネットからのデータ全般のダウンロード､
‫ハードドライブやSDカードからのデータアクセスなど､ すべてUIスレッドが行っています｡
‫少し時間がかかるかもしれませんね｡
‫たとえそれが数ミリ秒であっても､ あるいは数ミリ秒でなく数ミリ秒であっても､ それはすでにバックグラウンドで行われるべきことです｡
‫そうしないと､ スレッドがすべて忙しいために何かを行う準備ができていないため､ UIがフリーズしてしまいます｡
‫わかりました｡
‫つまり､ スレッドプールを作るということですね｡
‫また､ いろいろなものがある場合は､ スレッドプールを利用するとよいでしょう｡
‫そこで､ 脅威のプールを利用する際には､ いくつかの注意点があります｡
‫一般的に脅威プールは､ 特定の作業やワークアイテムを実行するために存在し､ 次のスレッドの準備が整うか､ あるスレッドが終了するまで､
‫次の脅威を開始する前や次のワークアイテムを開始する前に､ かなり待機することになりますね｡
‫だから､ 何も起こらないアイドルタイムやスリーピングタイムがないのが脅威のプールの利点です｡
‫CPUに何もしなくてもいいという状況もあり得るので､ 結構なことです｡
‫そうでなければ､ 常時稼働させたり､ 重い作業をさせたりすると､ CPUにかなり負担がかかるからです｡
‫しかし､ 一般的にこの脅威プールは､ 単に､ OK､ 何もないか､ 私がスレッドを実行したり､ 新しいスレッドを作成するのに十分なスペースがあれば､
‫私はそうするつもりです､ 私はしなければならないことを実行するつもりです､ と言っています｡
‫ちなみに､ 管理されたスレッドプールのスレッドは､ そこにあるバックグラウンドスレッドです｡
‫スレッドは背景､ プロパティは真｡
‫だから､ 今まで見たことがないのです｡
‫しかし､ もし私がこのようにスレッドを作ったら､ ここからこの新しいスレッドを取得させてください｡
‫そして､ それを背景に据えようと思えば､ 据えられます｡
‫例えば背景がイコール真であるかということです｡
‫そうすると､ このスレッドをあなたの背景に設定することができるわけです｡
‫そして､ このスレッドプールのキューには､ バックグラウンドのスレッドしかないのです｡
‫もう1つ考慮すべき点は､ 脅威プールが脅威を再利用する場合です（今回がこれにあたります）｡
‫つまり､ 今までの脅威IDを再利用しているわけです｡
‫そうですね｡
‫この脅威の管理ID､ 何度も再利用されたんですよ｡
‫その場合､ 脅威プールは脅威ローカルストレージのデータをクリアしません｡
‫そのため､ あるメソッドが脅威ローカルストレージを調査する際に､ 発見した値は､ 脅威プール脅威の以前の使用から残っている可能性があります｡
‫だから､ それは考えなければならないことなのです｡
‫一般的な脅威のプールについてもっと知りたい方は､ リンクをご覧ください｡