2014-08-22 2 views
2

Я просто пытался выяснить, как я использую объект Task, чтобы время от времени выполнялось в отдельном канале. Но интересно, Task(()=>{...}) похоже на создание new Thread(new ThreadStart(()=>{....}))?Выполняет ли каждый новый System.Threading.Tasks.Task() новый поток?

+0

Задачи использует ThreadPool, не поточно – Rangesh

ответ

2

Короткий ответ: Нет. Задачи выполняются через пул потоков. Вот блог об этом: Threads vs. Tasks: Задача не создает свой собственный поток ОС. Вместо этого задачи выполняются TaskScheduler; планировщик по умолчанию просто запускается на ThreadPool

+0

косвенно вы хотите сказать, когда я создаю новую задачу его создания экземпляра/создать/загрузить новый поток из пула потоков ?? – BreakHead

+0

@BreakHead Нет, ThreadPool может повторно использовать потоки. – BartoszKP

+0

@BreakHead Если в потоковом потоке имеется простаивающий поток, он будет использовать этот поток. Если в потоковом потоке нет простаивающих потоков, будет создан новый поток. Когда в потоковом потоке простаивают несколько потоков, некоторые из них будут остановлены. (Это несколько упрощает, но вы поняли эту идею.) –

3

A Task представляет собой обещание работ, которые будут выполнены в будущем.

Есть несколько вариантов, как Task получает создано:

  1. Task.Run Использование или Task.Factory.StartNew без флагов - Это будет очередь работать на .NET ThreadPool, как указано.

  2. Использование Task.Factory.StartNew с указанием TaskCreationOptions.LongRunning - Это будет сигнализировать TaskScheduler, чтобы использовать новый поток вместо потока ThreadPool.

  3. При использовании функции async-await C# -5, также известной как Promise Tasks. Когда вы await по методе возвращающей Task или Task<T>, они не могут использовать любой механизм многопоточности, либо ThreadPool или new Thread делать свою работу, как они могут использовать чисто асинхронный API, то есть они будут продолжать выполнять на резьбе который выполнил их и вернет управление методу вызова после первого ключевого слова await.

  4. Благодаря Servy для этого. Другими вариантами исполнения является создание настраиваемого TaskScheduler и передача его в Task.Factory.StartNew. Обычай TaskScheduler даст вам точный контроль над исполнением вашего Task

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

+0

К вашему пункту № 3 действительно есть задачи, которые могут быть созданы, которые представляют это, но они не создаются с помощью 'await'. Любой код, следующий за 'await', - это код, выполняемый где-то в некотором фактическом потоке. 'await' - это просто инструмент, который позволяет запускать некоторый код при завершении задачи; ожидаемая * задача * может или не может включать использование фактического потока. Существуют и другие варианты, кроме 1 и 2 при использовании 'Run' для дальнейших настроек. – Servy

+0

@Servy Я отредактировал пункт 3, чтобы дать понять, что я могу сказать. Что касается дальнейших вариантов, позаботьтесь о том, что я пропустил? –

+0

Вы пропустили персонализированный планировщик задач – Servy

2

Возможно. Это зависит.

  • По умолчанию Task объектов, созданные с помощью Task.Run, Task.Factory.StartNew, или с помощью Task конструктора, будут использовать по умолчанию TaskSchedluer, который будет планировать делегат для запуска в пуле потоков.

  • Нестандартный TaskScheduler может использоваться для планирования задачи для выполнения в любом потоке, который вы определяете с помощью этого планировщика. Вы можете определить его для запуска в потоке пользовательского интерфейса, в его собственном новом потоке, в пуле потоков, кроме пула потоков .NET, совсем не так, или что-то еще, что вы хотите.

  • Вы можете создать Task с помощью TaskCompletionSource, в котором нет необходимости в существовании нити.Task даже не нужно представлять заполнение делегата. Он может представлять любую операцию, которая заканчивается в будущем, возможно, с результатом. Это может включать некоторый код, выполняющийся в потоке, или он может представлять собой асинхронную операцию, такую ​​как IO, поведение пользователя, запуск события, состав различных других задач или что-либо еще, что вы хотите создать.

Смежные вопросы