В терминах информатики, Task
- это будущее или обещание . (Некоторые люди используют эти два термина синонимно, некоторые используют их по-разному, никто не может согласиться с точным определением.) По сути, Task<T>
"обещает" вернуть вам T
, но не сейчас дорогая, я немного занята, почему бы тебе не вернуться позже?
A Thread
- это способ выполнить это обещание. Но не каждому Task
нужен новый Thread
. (На самом деле, создание потока часто нежелательно, потому что это намного дороже, чем повторное использование существующего потока из пула потоков. Об этом чуть позже.) Если ожидаемое вами значение приходит из файловой системы или базы данных или сети, то нет необходимости для потока сидеть и ждать данных, когда он может обслуживать другие запросы. Вместо этого Task
может зарегистрировать обратный вызов для получения значений, когда они будут готовы.
В частности, Task
не не говорит , почему так много времени занимает возвращение значения. Возможно, , что для вычисления потребуется много времени, или для извлечения потребуется много времени. Только в первом случае вы можете использовать Thread
для запуска Task
. (В .NET потоки чертовски дороги, поэтому вы, как правило, хотите избегать их настолько, насколько это возможно, и действительно используете их только в том случае, если вы хотите выполнять несколько тяжелых вычислений на нескольких процессорах. Например, в Windows поток весит 12 Кбайт (Я думаю), в Linux поток весит всего 4 килобайта, в Erlang / BEAM даже 400 байтов. В .NET это 1 микроб!)