NIX
а он не работает
Stas
СТОП
NIX
вот
Stas
он возвращает управление в место откуда ты его вызвал
NIX
если он не ожидает, то какой от него толк?
Stas
лол
NIX
ну смотри
Владислав
Он ожидает
Владислав
Но
Владислав
Одно дело заблокировать поток
Stas
толк в том что он не ожидает тупо заняв ресурсы, он ВЕРНУЛ УПРАВЛЕНИЕ
Владислав
Другое - поставить триггер на завершение другой задачи, а в этом потоке ещё можно много выполнить
Stas
он не делает Task.Wait()
Владислав
Проще говоря
Владислав
Такой подход позволяет не создавать на каждый запрос к серверу отдельный поток
Владислав
Даже пул не трогают
Владислав
Это один поток
Stas
да он думает что таск это поток, и если ты написал Task.Run то всё пздц, у тебя всё распаралелилось
Владислав
Он он быстро передает управление в другие
Владислав
Хд
NIX
Task.Run - это в любом случае другой поток
Stas
омг
Владислав
Нет
Владислав
Thread.start - да
Владислав
Task.run берет свободный поток(включая те, с которых контексты ушли) и выполняет твой код там
Stas
щас я тебе набросаю пример
Владислав
Обычно в тредпуле не больше потоков, чем у тебя в процессоре есть
Владислав
Это освобождает от переключения контекста потоков, но переключение, которые уже в clr (как раз работа тасков) остаются
NIX
хорошо, а в каком потоке тогда выполняется код из Task , если у меня он всего один?
Владислав
Поток один?
Владислав
Нет
NIX
в моём прилоении
NIX
приложении
NIX
или вы хотите сказать что поток берётся с других прилоений?
Владислав
Ща
Владислав
Твой task.run раньше был threadpool.QueueUserWorkItem(WaitCallback, Object)
Владислав
Тредпул имеет свои потоки
NIX
и как же тогда эта выреска с майкрософта? Если ваша задача ограничена производительностью ввода-вывода, используйте async и await без конструкции Task.Run. Библиотеку параллельных задач использовать не следует. Причина этого указана в статье Подробный обзор асинхронного программирования.
Владислав
И на них раскидывает задачи
Владислав
Все правильно
Владислав
Как тебе обьяснить
Владислав
Сейчас пример придет походу
Владислав
Ну лан
Владислав
Смотри
NIX
как то нужно точно)
Владислав
Задачи бывают вычислительные и ввод-вывод
Владислав
Вычислительные утилизируют проц в 100 проц
Владислав
Всегда
Владислав
Ну ядро точно
Владислав
Ввод-вывод - нет
Владислав
У тебя есть поток
Владислав
Основной
Владислав
Если ты его блокирует вводом-выводом
Владислав
То ничего больше вычислить параллельно ты не сможешь
Владислав
Для этого есть потоки
Владислав
Но
Владислав
Новый поток - накладные расходы на его создание
Владислав
Если потоков больше чем потоков проц - расходы на переключение контекста
NIX
да
Владислав
Майки решили проблему просто
Владислав
Тредпул
Владислав
4-8 потоков
Владислав
Но
Владислав
Тасков обычно больше
Владислав
И что делать когда нужно 12 тасокв параллельно - не ясно
Владислав
Тем более блокировки остаются (ввод вывод)
Владислав
Так вот
Владислав
Чтобы грузить поток, котогда где-то в коде ожидается ввод-вывод - существуют async await
Владислав
Ты вызываешь await
Владислав
(это синтаксическая конструкция, на самом деле она заменяет кучу кода)
Владислав
И теперь твой код закончился, и информация по тому, что делать в случае получения результата ввода сохраняется
Владислав
Ввод получен
Владислав
В поток опять улетает твой код(образно) и уже с результатом
Владислав
Все оставшееся время этот поток работал над другими задачами
Владислав
Проще говря
Владислав
Ты пишешь синхронный код
Владислав
А работает он параллельно
Владислав
За тебя все делает clr