У меня есть метод:
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 и запускают метод () сразу после создания экземпляра задачи. Когда мы должны использовать первый вариант, а когда второй?
c#
multithreading
task-parallel-library
Сергей Личенко
источник
источник
StartNew
по умолчанию,TaskScheduler.Current
которое может быть пулом потоков, но также может быть потоком пользовательского интерфейса.Ответы:
Второй метод,
Task.Run
был представлен в более поздней версии .NET Framework (в .NET 4.5).Тем не менее, первый метод
Task.Factory.StartNew
дает вам возможность определить множество полезных вещей о потоке, который вы хотите создать, ноTask.Run
не предоставляет этого.Например, допустим, вы хотите создать длительный поток задач. Если поток пула потоков будет использоваться для этой задачи, то это может рассматриваться как злоупотребление пулом потоков.
Чтобы этого избежать, вы могли бы выполнить задачу в отдельном потоке. Недавно созданный поток , который будет посвящен этой задаче и будет уничтожен, как только ваша задача будет завершена. Вы не можете достичь этого с помощью
Task.Run
, в то время как вы можете сделать это с помощьюTask.Factory.StartNew
, как показано ниже:Как указано здесь :
источник
that’s exactly equivalent to
не держит.tha's exactly equivalent to
не имеет. Заранее спасибо. Было бы неплохо объяснить с комментариями к вашему коду. Спасибо :)TaskScheduler.Default
. Пожалуйста, смотрите здесь referencesource.microsoft.com/#mscorlib/system/threading/Tasks/... .