Вызов метода (Action) в Task.Factory.StartNew не вызывается немедленно
У меня сложилось впечатление, что я мог бы просто вызвать этот поток, и все, что было в моем методе "DoSomething", просто начало бы происходить, но, очевидно, нет.
Когда я вызываю эту строку:
Task.Factory.StartNew(() =>
ControllerClass.DoSomething("data"),
CancellationToken.None,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
ControllerClass.DoSomething ("data") не выполняется.
Однако, если я добавлю Wait, метод будет вызван.
Причина, по которой я использую опцию LongRunning, заключается в том, что метод может быть LongRunning в некоторых случаях, когда он начинает выполняться. И да, сам метод работает при вызове inline. Просто он должен быть в потоке, чтобы основная программа могла продолжать работу, пока этот поток делает свое дело.
Кстати, я тоже пробовал так называть это и получал те же результаты:
Task.Factory.StartNew(() =>
ControllerClass.DoSomething("data")).ContinueWith
(t =>
{
SendErrorEmail(t.Exception);
}, TaskContinuationOptions.OnlyOnFaulted
);
Я пропускаю какую-то опцию, чтобы сказать ему, чтобы начать выполнение вызова метода сразу?
1 ответ
У меня сложилось впечатление, что я мог бы просто вызвать этот поток, и все, что было в моем методе "DoSomething", просто начало бы происходить, но, очевидно, нет.
Нет, этого не происходит. На самом деле, когда вы пишете это:
Task.Factory.StartNew(() =>
ControllerClass.DoSomething("data"),
CancellationToken.None,
TaskCreationOptions.LongRunning, TaskScheduler.Default);
под прикрытием ваша задача попасть в очередь и рано или поздно будет запущена в потоке ThreadPool
,
По данным MSDN:
Вызов StartNew функционально эквивалентен созданию Задачи с использованием одного из ее конструкторов, а затем вызову Start, чтобы запланировать ее выполнение.
Ругая вас другим заявлением:
Однако, если я добавлю Wait, метод будет вызван.
Это правда, потому что TaskFactory.StartNew
возвращает Task
объект. когда мы называем Wait
метод задания
Если текущая задача еще не запущена, метод Wait пытается удалить задачу из планировщика и выполнить ее в текущем потоке. Если это невозможно сделать или текущая задача уже начала выполнение, она блокирует вызывающий поток, пока задача не завершится.
В нескольких словах Wait
блокирующее действие
Пожалуйста, посмотрите здесь для получения дополнительной информации об этом.
Я пропускаю какую-то опцию, чтобы сказать ему, чтобы начать выполнение вызова метода сразу?
Насколько я знаю, до тех пор, пока я не позвоню, подожди, альтернативы нет.