先日、長期実行タスクの場合、.NETのスレッドプールまたはタスク並列を使用する代わりに手動でスレッドを作成することをお勧めします。私は本当に長時間実行されているIOタスクのために、C#スレッディングについて学んでいるので、誰かが私を啓発したいと思っています。前もって感謝します。長時間実行されているプロセスでは、スレッドプールの代わりに手動でスレッドを実行する方が良いですか?
答えて
ThreadPoolスレッドは、スレッドプールからの新しいリクエストを処理するために再スケジュールされる可能性があるため、軽量で安価であるため、他の操作のために同じスレッドを再スケジュールすることもできます。最小スレッド数(ThreadPool.SetMinThreads())であるため、新しい要求が来るまで有効になります。したがって、これは複数の軽量操作のための良い解決策です。たとえば、数秒ごとに別々の/新しいスレッドを作成する必要があります。 MSDNマガジンの
非常に良い記事:スレッドの最小数に達するとDedicated thread or a Threadpool thread?
は、スレッドプールは、スレッドの数は、500ミリ秒ごとに1に作成されて 制限することを目指しています。 これはインテリジェントなメカニズムであり、 の新しいスレッドを作成するのにかかるコストがかかるのを避け、複数のスレッドプールスレッドがその期間内に解放された になる可能性があります。 .NET 4.0以降
- タスクライブラリをパラレルには、手動スレッド管理と同期のための良好な高レベルの抽象化と代替手段ですので、あなたのコードは、エラーが発生しにくいだろう。だからちょうどcreate a TaskとTaskCreationOptions.LongRunning、私はこれがメインテナビリティの観点からアプリケーションアーキテクチャに最適な投資と考えています。
便利な読書:
あなたの指示に非常に感謝します。 – user1193665
真です。スレッドプールは小さな作業単位用に最適化されており、スレッドプールスレッドを保持することで他の作業に干渉することがあります。
私の経験則は、操作に1秒以上かかる場合は、スレッドプールスレッド上にあってはならないということです。それはおそらくかなり長いでしょう。
これは文書化されていませんが、Task
をで開始すると、タスクを実行する新しいスレッドが開始されます。
ほとんどのIOタスクでは、実際に使用するはずのフレームワークメソッドの非同期バージョンがあります。これらはカーネル関数を使用し、スレッドをブロックしないことを意味します。
いつものように、私はJoe Albahari's free ebook、 、それに続いてJoe Duffy's Concurrent Programming on Windowsと読むことをお勧めします。後のページは1000ページですが、役に立つ情報が満載です。
私が使用する基準は、スレッドが何かが起こるのを待っているか、別のスレッドが待っているかもしれない何らかの特定のアクションを実行する、かなりの時間を費やすかどうかです。 – supercat
- 1. 長時間実行されているRailsの移行手順が終了していないようです
- 2. WCFで長時間実行されるプロセスを扱う
- 3. iOS4のバックグラウンドで長時間実行され続けるプロセス
- 4. 長時間実行されるプロセスの.NET自動テスト
- 5. 長時間実行スレッド+ライフサイクル
- 6. ジャンゴセロリ:私は5分ごとに実行する必要があります長時間実行プロセスを持っていますが、プロセスの複数のインスタンスを同時に実行することはありません長時間実行プロセス
- 7. WCFで長時間実行される非同期スレッド
- 8. 長時間実行しているPythonスレッドを終了する
- 9. 長時間実行されているプロジェクトでRails移行を統合する
- 10. fで長時間実行されているエージェント#
- 11. gunicorn + nginxで長時間実行されているリクエスト
- 12. 長時間実行しているGoプログラムを実行するにはどうすればよいですか?
- 13. Androidのアクティビティで長時間実行されているプロセスを表示する方法は?
- 14. 長時間実行されているプロセスの警告/エラーを追跡するベストプラクティスは何ですか?
- 15. 長時間実行されるタスクを実行するフレームワーク
- 16. 長時間実行中のジョブのPHP Cronジョブの代わり
- 17. 長時間実行されるタスク、別のスレッドまたは別のプロセスで実行する必要がありますか?
- 18. ASP.NETはバックグラウンドで長時間実行されるメソッドを実行します
- 19. ASP.Netアプリケーションで長時間実行されるプロセスを処理する最善の方法は何ですか?
- 20. 長時間実行するQtスレッドを終了するには
- 21. 長時間実行されるプロセス(Python)のタイムアウトとWindowsサービス
- 22. Akkaのアクターパターンと長時間実行されるプロセス
- 23. ThreadPoolsと長時間実行のプロセス用のスレッド
- 24. Informixで長時間実行されているクエリを検索しますか?
- 25. DELETEクエリが長時間実行されています
- 26. バックグラウンドで長時間実行するタスク
- 27. ASP.NETで長時間実行されるバックグラウンドプロセス - Application_Startまたは別のプロセス?
- 28. IEで長時間実行されているJavaScriptをプロファイリングする
- 29. ExecutorServiceスレッドプールでスレッドが実行されているかどうかを確認する方法
- 30. ASP.NETは長時間実行されているスレッドでスレッドステータスをチェックしますか?
この質問を検討してください:http://stackoverflow.com/questions/230003/thread-vs-threadpool –