xin9le.net

Microsoft の製品/技術が大好きな Microsoft MVP な管理人の技術ブログです。

TPL入門 (19) - 長いタスクの明示

落ち穂拾いがこんなに続くなんておかしな話ですが、第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が指定された場合の挙動を自由に処理することができるためです。