落ち穂拾いがこんなに続くなんておかしな話ですが、第3回です。今回は処理時間の長いタスクの明示についてです。
処理時間の長いタスク
スレッドプールに登録されたタスクの実行時間が非常に長い場合、それはワーカースレッドを長い間専有することになります。このようなことが起こると、キューに溜まっている "早く実行したい別のタスク" の実行が遅延され、折角並列処理を使って早く処理したいと思っているはずなのに、その恩恵を十分に受けられない可能性があります。このように、実行するタスクに時間がかかると分かっている場合、タスク生成時にTaskCreationOptions列挙体のLongRunningフラグを指定すると良いです。
using System.Threading; using System.Threading.Tasks; namespace ConsoleApplication { class Program { static void Main() { var task = Task.Factory.StartNew(() => { //----- Do Something Thread.Sleep(3000); }, TaskCreationOptions.LongRunning); task.Wait(); } } }
LongRunningを指定すると、そのタスクはスレッドプールに含まれない専用のスレッド上で動作させられます。このようにすることで、ワーカースレッドの負荷を減らすことができます。
使用上の注意
しかし、LongRunningフラグは通常使用すべきではありません。既定の動作と比較してパフォーマンスが大きく低下するような場合だけに利用を留めてください。また、この挙動は既定のタスクスケジューラーを利用している場合に限られます。カスタムタスクスケジューラーを利用する場合は、LongRunningが指定された場合の挙動を自由に処理することができるためです。