##質問
.NETにおけるマルチスレッドプログラミングの学習をしたいため、参考になるサイト・書籍を教えていただきたいです。
##背景
業務によりしばしばマルチスレッドのサーバーサイドアプリケーションを開発するのですが、社内では未だにスレッド関連の機能の実現にSystem.Threading.Threadクラスを利用しています。
ところが、ネット上では「ThreadクラスのTaskクラスによって完全に取って代わられるべきである」といった趣旨の文献が多数散見されます。
とはいえ、実際にTaskクラスを利用してみたところ、特定のスレッドで負荷がかかる処理を行うとそのスレッドが止まってしまう、といった問題が発生したことがありました。(そして、その問題はTaskクラスをThreadクラスに置き換えることで解決しました。)
このような事情から業務では未だにThreadクラスを利用しているのですが、これからもThreadクラスを使い続けることに危機感を覚えています。
そこで、.NETの並列処理に関する技術を体系的に学習し、今後の業務に生かしたいと思いました。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
基本的には、TaskクラスがThreadクラスに劣るような部分はないので「ThreadクラスのTaskクラスによって完全に取って代わられるべきである」の考え方は正しいと思います。
実際にTaskクラスを利用してみたところ、特定のスレッドで負荷がかかる処理を行うとそのスレッドが止まってしまう、といった問題が発生したことがありました。
これは、Taskクラスがスレッドプールを基盤にしているので、ワーカースレッドの最大数以上の処理をTaskクラスに同時に処理させようとしたから発生している問題では?
だとすれば、Taskクラスのワーカースレッドの最大数の設定を適切に増やしさえすれば解決する問題のはずです。
ちなみに、私は最近になってC#を本格的に使用するようになったのですが、非同期メソッド入門 (1) - 非同期処理の歴史の記事が、最初にC#における非同期処理(マルチスレッドに留まらない非同期処理全般)の全体像を知るうえで非常に参考になりました。
投稿2016/08/31 04:44
総合スコア344
0
薦めていただいた書籍「C#によるマルチコアのための非同期/並列処理プログラミング」が手に入りました。
書籍なので当然といえば当然ですが、情報リソースとしてのボリュームが最も大きいので、これを薦めてくださった方をベストアンサーとさせていただきます。
これからじっくり読んでいきます。
ありがとうございました。
投稿2016/09/03 12:38
総合スコア67
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
「ThreadクラスのTaskクラスによって完全に取って代わられるべきである」
それは間違った認識です。Task
クラスは完璧ではありません。状況に応じて使い分けるべきです。
例えば、BackgroundWorker
クラスは有力な選択肢となり得ます。進捗を通知する仕組みを備えているので、「ダウンロード中 ○○%」のような表示をさせたいときなどに便利です。
また、時間のかかる処理やスレッドの優先度を変更する場合など、スレッドプールを使うべきではない場合もあります。
その辺のことは、マイクロソフトもスレッドプールを使わない方が良い場合があると説明しています。参考にしてみてはいかがでしょうか。
→ The Managed Thread Pool
追記
説明不足でした。前述の「時間のかかる処理」とは、その都度スレッドを走らせるのではなく、例えばサーバーの要求待ちタスクのような一定期間裏で動き続けているような処理のことです。
投稿2016/08/31 10:39
編集2016/08/31 10:53総合スコア5938
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/31 12:28
2016/08/31 12:35
0
ベストアンサー
Webサイトは「C# によるプログラミング入門 | ++C++; // 未確認飛行 C」と「Threading in C#(英語)」を、書籍は「C#によるマルチコアのための非同期/並列処理プログラミング」をお薦めしておきます。
ただし、スレッド利用が適切とも限らないケースも多々ありますからご注意ください。
ネット上では「ThreadクラスのTaskクラスによって完全に取って代わられるべきである」といった趣旨の文献が多数散見されます。
これは概ね正しい主張だと思います。ただしThreadを単純にTaskへと置き換えれば良いという話ではありません。現実的にはユースケースに応じて、Taskやasync/awaitを組み合わせていくべきですね。
投稿2016/08/31 04:34
編集2016/08/31 04:43総合スコア6189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/31 10:59
2016/08/31 13:42 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/08/31 11:09
2016/08/31 12:53