Подтвердить что ты не робот

Разница между Task (System.Threading.Task) и Thread

Из того, что я понимаю о различии между Task и Thread, эта задача произошла в пуле потоков, в то время как поток - это то, что мне нужно управлять самостоятельно. (и эта задача может быть отменена и возвращена в поток- пул в конце его миссии)

Но в каком-то блоге я читал, что если операционной системе нужно создать задачу и создать thread = > , будет легче создать (и уничтожить) задачу.

Кто-то может объяснить, почему создание задачи просто для этого потока?

(или, может быть, я здесь что-то пропустил...)

4b9b3361

Ответ 1

Я думаю, что то, о чем вы говорите, когда вы говорите "Задача", System.Threading.Task. Если это так, тогда вы можете думать об этом так:

  • Программа может иметь много потоков, но ядро ​​процессора может запускать только один поток за раз.
    • Потоки очень дороги, а переключение между потоками, которые работают, также очень дорого.
    • Итак... Имея тысячи потоков, делающих вещи, неэффективны. Представьте, если ваш учитель дал вам 10 000 заданий. Вы потратили бы столько времени на велосипед между ними, что никогда не получите ничего. То же самое может случиться с процессором, если вы запускаете слишком много потоков.

Чтобы обойти это, платформа .NET позволяет создавать задачи. Задачи - это небольшая работа, связанная с объектом, и они позволяют вам делать интересные вещи, такие как сбор результатов этой работы и объединение частей работы (сначала зайдите в магазин, затем купите журнал).

Задачи запланированы в пуле потоков. Конкретное количество потоков зависит от используемого планировщика, но планировщик по умолчанию пытается выбрать несколько потоков, которые оптимальны для количества ядер процессора, которые у вас есть, и сколько времени ваши задачи тратят на самом деле, используя процессорное время. Если вы захотите, вы даже можете написать свой собственный планировщик, который делает что-то конкретное, например, чтобы все задачи для этого планировщика всегда работали в одном потоке.

Итак, подумайте о задачах как о статьях в списке дел. Возможно, вы сможете сделать 5 вещей одновременно, но если ваш босс даст вам 10000, они будут накапливаться в вашем почтовом ящике до тех пор, пока первые 5, которые вы делаете, не будут выполнены. Разница между задачами и ThreadPool заключается в том, что задачи (как я упоминал ранее) дают вам лучший контроль над отношениями между различными элементами работы (представьте, что нужно делать элементы с несколькими сшитыми друг с другом инструкциями), тогда как ThreadPool просто позволяет вам стоять в очереди куча отдельных, одноэтапных элементов (функций).

Ответ 2

Вы слышите два разных понятия задачи. Первое - это понятие задания, второе - понятие процесса.

Долгое время (в компьютерных терминах) не было потоков. Каждый исполняемый экземпляр программы назывался процессом, поскольку он просто выполнял один шаг за другим за другим, пока не вышел. Это соответствует интуитивно понятной идее процесса как последовательности шагов, например, конвейера factory. Операционная система управляет абстракцией процесса.

Затем разработчики начали добавлять несколько сборочных линий на заводы. Теперь программа может делать сразу несколько операций, а также библиотеку или (чаще всего сегодня) операционную систему будет управлять планированием шагов в каждом потоке. Поток - это легкий процесс, но поток принадлежит процессу, и все потоки в процессе обмениваются памятью. С другой стороны, несколько процессов не могут взаимодействовать с памятью друг друга. Таким образом, несколько потоков на вашем веб-сервере могут получать одну и ту же информацию о соединении, но Word не может получить доступ к структурам данных Excel в памяти, поскольку Word и Excel работают как отдельные процессы. Идея процесса как серии шагов на самом деле не соответствует модели процесса с потоками, поэтому некоторые люди стали ссылаться на "абстракцию, ранее известную как процесс". Это второе определение задачи, которое вы видели в сообщении в блоге. Обратите внимание, что многие люди все еще используют слово process для обозначения этой вещи.

Ну, поскольку потоки стали больше commmon, разработчики добавили еще больше абстракций поверх них, чтобы сделать их более удобными в использовании. Это привело к возникновению пула потоков, который представляет собой "пул" потоков, управляемый библиотекой. Вы передаете библиотеке задание, а библиотека выбирает поток и запускает задание в этом потоке..NET Framework имеет реализацию пула потоков, и в первый раз, когда вы услышали о "задаче", документация действительно означала задание, которое вы передаете пулу потоков.

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

Ответ 3

Потоки были частью .Net из v1.0. Задачи были введены в TPL параллельной библиотеки задач, которая была выпущена в .Net 4.0.

Вы можете рассматривать задачу как более сложную версию Thread. Они очень просты в использовании и имеют много преимуществ по сравнению с Threads следующим образом:

  • Вы можете создавать типы возвращаемых значений для задач, как если бы они были функциями.
  • Вы можете использовать метод "Продолжить", который будет ждать предыдущей задачи и затем начать выполнение. (Тестирование ожидания)
  • Тезисы Законы, которые следует избегать в соответствии с указаниями моей компании.
  • Вы можете использовать Task.WaitAll и передать массив задач, чтобы вы могли дождаться завершения всех задач.
  • Вы можете присоединить задачу к родительской задаче, поэтому вы можете решить, будет ли родитель или ребенок существовать в первую очередь.
  • Вы можете получить данные parallelism с запросами LINQ.
  • Вы можете создавать параллельные циклы foreach и foreach.
  • Очень легко обрабатывать исключения с задачами.
  • * Самое главное, если один и тот же код запускается на одноядерном компьютере, он просто будет действовать как один процесс без каких-либо сбоев в потоках.

Недостаток задач над потоками:

  • Вам нужно .Net 4.0
  • Новички, которые изучили операционные системы, могут лучше понимать потоки.
  • Новое в структуре, поэтому доступ к ней невелик.

Некоторые советы: - Всегда используйте метод Task.Factory.StartNew, который является семантически совершенным и стандартным.

Взгляните на задачу Parallel Libray для получения дополнительной информации http://msdn.microsoft.com/en-us/library/dd460717.aspx

Ответ 4

Расширение комментария Эрика Липперта:

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

Task, с другой стороны, представляет собой абстрактное понятие некоторой работы. Это задание может иметь результат, и вы можете подождать, пока работа закончится (вызывая Wait()) или скажите, что вы хотите что-то сделать после завершения задания (вызывая ContinueWith()).

Наиболее распространенным заданием, которое вы хотите представить, является выполнение некоторых вычислений параллельно с текущим кодом. И Task предлагает вам простой способ сделать это. Как и когда код действительно запускается, определяется TaskScheduler. По умолчанию используется ThreadPool: набор потоков, которые могут запускать любой код. Это делается потому, что создание и переключение потоков неэффективно.

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

Если вы хотите знать, когда использовать Task и когда использовать Thread: Task, проще использовать и более эффективно создавать собственные Thread s. Но иногда вам нужен больше контроля, чем предлагаемый Task. В этих случаях имеет смысл использовать Thread напрямую.

Ответ 5

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