Гугл говорит мне что, класс Task это более высокоуровневый, современный и и менее ресурсоемкий способ писать программы с использованием многопоточности и лучше использовать только, а про Thread стоит вообще забыть.
Сегодня был на собеседовании, где люди пишут высокоэффективные, нагружённые решения на С# много лет. И когда я сказал "Task лучше Thread" на меня посмотрели как на идиота.
Видимо я чего-то не понимаю. Подскажите что и для каких целей лучше?
Ну там пишут, что Task - это абстракция, когда тебе неважно что это такое именно, тебе просто надо запустить что-то асинхронно. А Thread - это конкретно именно отдельный thread.
Другими словами, запуская что-то через Task, оно может выполиться в thread или в thread pool
А когда ты запускаешь Thread - это будет точно Thread.
Лучшего тут нет, зависит от того, что тебе нужно. В общем случае Task получается выгоднее, так как за тебя компилятор решит что тут лучше.
По сути таск это пул потоков, за которыми не нужно особо следить и ими легче пользоваться, а так же они могут возвращать значения. Их можно использовать, например для запросов на сервер, для разрузки основного потока - например что-то сложное посчитать. Thread то быстрее, но task дает больше возможностей и меньше внимания к себе
а Task хуже подходит для (допустим) больших вычислений потому что... почему? ему никогда не выделается ресурсов больше какой то границы, а Thread может использовать хоть все? или это какое то странное правило хорошего тона? или почему еще?
Untiwe, я, в основном, использую Task. Thread использую редко. Task используется, где нужна высокая производительность. Например, при работе с несколькими однотипными устройствами по USB одновременно у Task выше скорость передачи данных. И Task хорош тем, что можно выделить конкретную задачу с автоматическим завершением. Особенно в асинхронных. И управление данными в таком случае куда проще. Thread такое не позволяет, надо вручную им управлять. Иначе будут неизбежны ошибки. Обычно Thread выделяю там, где он будет работать на протяжении работы всей программы. Или для выделения нескольких основных потоков. И то их там немного.
Это напоминает мне coroutines из python или promise из javascript где задачи выполняются из одного потока, просто он между ними переключается "под капотом" А это уже не отельные потоки как в Thread.
In general, I'd recommend that you use the higher level abstraction wherever you can: in modern C# code you should rarely need to explicitly start your own thread.
Это примерно то, что я сегодня сказал Task лучше Thread и на меня посмотрели как на идиота. Видимо или люди в компании чего то не понимают, или сам Джон Скит)
sharpcorner отвечает на мой вопрос
Why we need Tasks
It can be used whenever you want to execute something in parallel. Asynchronous implementation is easy in a task, using’ async’ and ‘await’ keywords.
Why we need a Thread
When the time comes when the application is required to perform few tasks at the same time.
Но из этого ответа я так и не понял что и где лучше
In computer science terms, a Task is a future or a promise. (Some people use those two terms synonymously, some use them differently, nobody can agree on a precise definition.) Basically, a Task "promises" to return you a T, but not right now honey, I'm kinda busy, why don't you come back later?
Это примерно то, что я сегодня сказал Task лучше Thread и на меня посмотрели как на идиота
Так это от задач зависит. Task удобно использовать как просто "написал - и забыл", не особо заботясь что там и как будет выполняться. А у чуваков, видимо, задачи более низкоуровневые и им такие вольности с тасками не нравятся и хотят контролить потоки более тщательно.
Вы, видимо, в разных контекстах проблем общались.
Untiwe, Я бы попросил их объяснить почему они выбрали Thread вместо Task. Пусть проявят свои профессиональные качества :) Это же собеседование - общение в обе стороны. Вот и выявишь некомпетентность их команды.
Скорее всего ответят, что есть одна ресурсоемкая задача, которая выделяется большой продолжительностью в сравнении с другими. Такую, возможно, действительно стоит запустить отдельным потоком.
Thread - это отдельный поток в котором вы хотите что-то выполнять параллельно от других потоков.
(например чтобы не зависал интерфейс, вы запускаете вашу задачу в отдельном потоке)
(например вы хотите задействовать все ядра процессора и запускаете несколько задач в нескольких параллельных потоках)
Task - это обертка над Thread которая позволяет переиспользовать созданные потоки (Пул потоков).
Переиспользовать потому-что создавать каждый раз Thread это очень долго и дорого.
Task-и так же предоставляют дополнительный фишки как:
- асинхронная модель (async/await),
- учёт количества ядер процессора,
- учёт простоя во время системных вызовов (сеть, файловая система и т.п.)