В чём отличие работы async/await в разных ситуациях?

Если мы выполняем какую-то операцию I/O асинхронно (чтение/ запись из файла, ожидание ответа сервера итд.) через заранее заготовленные методы(Write/ReadAsync) которые уже определены в BCL - то дополнительный поток не создается и все происходит через низкоуровневую систему(драйвера и ОС). Если же мы используем async/await в другом контексте, то если операнд оператора await не выполнен на момент опроса то мы берем поток из пула потоков( здесь кстати у меня возник вопрос - всегда ли таски выполняются в тред пуле или нет - помимо разумеется RunSynchronusly() ) в этот поток помещаем задачу и возвращаем управление. Далее, как я понимаю многое здесь зависит от SynchronizationContex, но я не нашел на просторах интернета понятное лично мне объяснение для чего нужен(единственное что я понял - он решает в каком потоке продолжится выполнение асинхронного метода после await) этот класс и как он связан с асинхронностью и многопоточность. Если кто знает хорошие ресурсы по этому вопросу или может сам объяснить - буду весьма признателен. Резюмируя - Что делает SynchronizationContext и как он связан с многопоточностью и асинхронностью. Верно ли моё понимание async/await? Task - запускается всегда в пуле потоков если мы явно не указываем обратного, или нет - тут прошу подробно объяснить. Заранее спасибо за ответ.


Ответы (0 шт):