方法は次のとおりです:
private static void Method()
{
Console.WriteLine("Method() started");
for (var i = 0; i < 20; i++)
{
Console.WriteLine("Method() Counter = " + i);
Thread.Sleep(500);
}
Console.WriteLine("Method() finished");
}
そして、このメソッドを新しいタスクで開始したいと思います。新しいタスクは次のように開始できます。
var task = Task.Factory.StartNew(new Action(Method));
またはこれ
var task = Task.Run(new Action(Method));
Task.Run()
しかし、との間には何か違いがあるのでしょうかTask.Factory.StartNew()
。 どちらも ThreadPool を使用しており、Task のインスタンスを作成した直後に Method() を開始します。 最初のバリアントはいつ使用し、 2 番目はいつ使用すればよいのでしょうか。
ベストアンサー1
2 番目のメソッドは、Task.Run
.NET フレームワークの新しいバージョン (.NET 4.5) で導入されました。
ただし、最初のメソッド ではTask.Factory.StartNew
、作成するスレッドに関する多くの有用な事項を定義する機会が与えられますが、 ではTask.Run
これは提供されません。
たとえば、長時間実行されるタスク スレッドを作成するとします。このタスクにスレッド プールのスレッドが使用される場合、これはスレッド プールの乱用と見なされる可能性があります。
これを回避するには、タスクを別のスレッドで実行します。このタスク専用の新しく作成されたスレッドは、タスクが完了すると破棄されます。ではこれを実現できませんがTask.Run
、 では以下のように実現できますTask.Factory.StartNew
。
Task.Factory.StartNew(..., TaskCreationOptions.LongRunning);
述べられているようにここ:
そこで、.NET Framework 4.5 Developer Preview では、新しい Task.Run メソッドを導入しました。これはTask.Factory.StartNewを廃止するものではなく、多数のパラメーターを指定せずにTask.Factory.StartNewをすばやく使用できる方法と考えるべきです。これはショートカットです。実際、Task.Run は、Task.Factory.StartNew で使用されるのと同じロジックに基づいて実装されており、いくつかの既定のパラメーターを渡すだけです。Task.Run に Action を渡すと、次のようになります。
Task.Run(someAction);
これは次のものとまったく同じです:
Task.Factory.StartNew(someAction,
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);