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