функции всегда выполняется какая-то io-bound операция, не требующая процессорного времени. Когда мы await-им эту операцию, то поток, в котором наша функция выполнялась, отдаётся thread pool-у, чтобы тот применил его для чего-то более полезного. Потом та операция завершается, происходит прерывание, говорящее thread pool-у вернуть этот поток нашей асинхронной функции, после чего её выполнение продолжается.
Слова async await не создают дополнительных потоков, а просто рационально используют текущий.
И с cpu-bound операциями асинхронность не имеет смысла. Всё верно?
Выполнение продолжится на любом потоке из пула, не обязательно на том, на котором стартовало
Неправильно
В этом единственная ошибка?
В целом направление мысли +- верное. Но есть много нюансов.
нет, в принципе построение неверное
Не в этом дело. Проблема в том, что CPU/IO-Bound и прочие тяжёлые или тормозные операции вызывают блокировку основого потока, и программа перестаёт быть отзывчивой. Чтобы это избежать и не блокировать основной поток, были придуманы асинхронные методы/функции, когда основной поток освобождается под другие нужды, а под тормозную операцию выделяется (не всегда) поток из ThreadPool'а. До оператора await код идёт синхронно, если что, а async, по сути, просто аттрибут для комилятора, чтобы дать методу поддержку асинхронных операций.
То есть CLR сам может определить, требует ли операция процессорного времени, и при необходимости выделить под неё поток?
Поток не обязательно идет в пул. Будет ли выполнено на том же потоке или нет, зависит от контекста синхронизации. Там не только IO bound может быть, сам по себе Task, абстракция над задачей, а задача, может быть какой угодно
Нет, CLR ничего не определяет
Да. Если таска простоит больше времени, чем ей выделилось, то для неё выделится поток из ThreadPool'а. Пусть помидоры поправят ньансы.
Поправляю, ты не прав
Тогда это делает компилятор?
Все зависит от реализации метода, который ты вызываешь
Конкретно. Механизм очередей и времени на исполнение тасок точно есть. Тогда что не так? 🤔
Ну ты сказал неправильные вещи, я и поправил🤷♂
Расскажи тогда пожалуйста, как тредпул менеджит время на исполнение таски, пожалуйста. Вот отправил ты свой делегат (таску) в очередь на тредпул. И что дальше?
Тебе я точно ничего не расскажу. У тебя ToArray - это динамический масив. На этом всё 🤔
ToArray это метод
Метод, который в твоём мирке, материализуется в динамический , а не статический, чья длина фиксирована 🤔. Может ничего не писать. С тобой ясно всё.
Чел, иди посмотри что такое динамический и статический массив
Длина статического массива должна быть известна во время компиляции
Подожди var n = readint() var arr= new int[n]; Это динамический массив?
Обсуждают сегодня