Гарантируется ли Task.Factory.StartNew () создать хотя бы один новый поток? - PullRequest
1 голос
/ 23 февраля 2012

Я понимаю, что TPL не обязательно создает новый поток для каждой задачи в параллельном наборе, но всегда ли он создает хотя бы один?Например:

private void MyFunc()
{
    Task.Factory.StartNew(() =>
    {
        //do something that takes a while   
    });

    DoSomethingTimely();   //is this line guaranteed to be hit immediately?
}

РЕДАКТИРОВАТЬ : Чтобы уточнить: Да, я имею в виду, гарантируется ли, что поток, выполняющий MyFunc(), не будет использоваться для выполнения //do something that takes a while.

Ответы [ 6 ]

7 голосов
/ 23 февраля 2012

Это соответствует текущему значению по умолчанию TaskScheduler.Вы можете просто представить, что кто-то делает что-то ужасное, например, реализует SynchronousTaskScheduler, который выполняет тело задачи во время QueueTask и задает его выполнение перед возвратом.

Предполагая, что вы не позволяете кому-то еще копаться спланировщики задач, вам не нужно об этом беспокоиться.

5 голосов
/ 23 февраля 2012

Это зависит от того, что вы подразумеваете под «немедленно», но я думаю, что разумно предположить, что TPL не собирается перехватывать ваш текущий выполняющийся поток для синхронного запуска кода в вашей задаче, если эточто ты имеешь в виду.По крайней мере, не с обычным планировщиком ... вы могли бы написать свой собственный планировщик, который делает , но обычно можно предположить, что StartNew будет планировать задачу, а не простозапустить его в линию.

2 голосов
/ 23 февраля 2012

Ваш главный вопрос и вопрос в вашем коде - это совершенно разные вопросы.Но ответы на два вопроса:

1) Нет, нет никакой гарантии, что поток будет запущен.То, что создано и запущено, является задачей .В конечном счете, какой-то поток должен будет выполнить эту задачу, но будет ли он создан, не определено.Существующий поток может быть использован повторно.

2) Это зависит от того, что вы подразумеваете под «немедленно».Строго говоря, нет гарантии своевременности.Но вы сказали системе выполнить эту задачу, и она по крайней мере запустит ее, как только завершит все, что считает более важным.Строгая справедливость и своевременность не гарантируются.

1 голос
/ 23 февраля 2012

Короче говоря: да, это гарантировано.

Дольше: если StartNew() не создает , а не создает новый поток, он будет использовать другой: либо свободный, либо в очереди.

1 голос
/ 23 февраля 2012

Да, он попадет очень скоро после отправки задания на выполнение.

Нет, он не создаст новый поток, но затребует его.Когда они говорят, что он не всегда создает новый поток, они ссылаются на тот факт, что он повторно использует потоки из пула потоков.

Размер пула основан на количестве обнаруженных ядер ЦП.,Но он всегда будет содержать хотя бы 1 поток.;)

0 голосов
/ 23 февраля 2012

DoSomethingTimely будет вызываться очень быстро, но какое это имеет отношение к созданию нового потока или добавлению задачи в очередь?

...