#18 Многопоточность - Thread, ThreadPool, Task. Ответ на вопрос собеседования C# / .Net

Поділитися
Вставка
  • Опубліковано 17 жов 2024
  • #многопоточность #поток #процесс #thread #system.threading #threadpool #task #taskfactory #async #await #csharp #dotnet #andriyshyrokoriadov
    В видео представлены способы создания потоков с использованием классов Thread, ThreadPool, Task, TaskFactory.
    Обзор представлен в форме ответа на вопрос, который встречается на собеседованиях на позицию "программист C# / .Net".
    Подписывайтесь на канал [программирование, путешествия]: / @andreyshyrokoriadov
    0:10 - введение
    0:55 - использование класса Thread
    3:05 - использование класса ThreadPool
    5:10 - использование класса Task
    5:55 - использование класса TaskFactory
    8:10 - использование ключевых слов async и await
    9:40 - конвенция названий асинхронных методов
    9:30 - атомарные и неатомарные операции
    10:00 - дополнительные методы класса Task
    Текст к фильму доступен по ссылке: ashyrokoriadov...
    Дополнительная информация:
    документация Thread docs.microsoft...
    документация ThreadPool docs.microsoft...
    документация Task docs.microsoft...
    документация TaskFactory docs.microsoft...

КОМЕНТАРІ • 69

  • @alexvetrov3438
    @alexvetrov3438 2 роки тому +8

    Одно из самых понятных объяснений, спасибо!

  • @17madjoker47
    @17madjoker47 3 роки тому +13

    Мужик ты крутой конечно, спасибо за информацию

  • @it_catt
    @it_catt 4 місяці тому

    Спасибо больше за объяснение! самое понятное объяснение

  • @shonchvibe
    @shonchvibe 3 роки тому +3

    отдельное спасибо за объяснения на доп ресурсе с примером кода!

  • @C0ntrolDev
    @C0ntrolDev Рік тому

    Спасибо!

  • @Antonina86
    @Antonina86 3 роки тому

    Спасибо, Андрей, хороший контент без воды!!!

  • @yz777zhumabayev6
    @yz777zhumabayev6 2 роки тому

    Очень наглядно) Спасибо

  • @ivannebyshinets5682
    @ivannebyshinets5682 2 роки тому +1

    Отличный урок, спасибо!

  • @РайкиТак
    @РайкиТак 2 роки тому

    Спасибо большое !! Очень полезно! Рада , что нашла вас!

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  2 роки тому

      А я рад подписчикам - представителям прекрасной половины человечества. Их у меня на канале около 10%.

    • @РайкиТак
      @РайкиТак 2 роки тому

      @@AndreyShyrokoriadov очень хорошо рассказано про потоки) Теперь у меня в голове все уложилось по полочкам) На эту базу уже можно читать Рихтера. Сразу без понимая всего та, часть книги, где он пишет про потоки не зашла.

  • @РНС_Саакашвили

    спасибо . . . поставил лайк

  • @Meisst
    @Meisst 2 роки тому

    Спасибо за труд!

  • @Дмитрийсекрет-н7о
    @Дмитрийсекрет-н7о 3 роки тому +1

    классный урок. Подготовка к собеседованию.

  • @ОргПетров
    @ОргПетров 3 роки тому +3

    Молодец! Хорошие видео делаешь! Продолжай в том же духе!👍

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому +2

      Спасибо! В планах - создание около 35 видео на тему C#, то есть ещё около 15 видео. А потом будут видео на другие темы информатики.

    • @olegholostenco8736
      @olegholostenco8736 3 роки тому

      @@AndreyShyrokoriadov Спасибо за работу. С нетерпением жду следующих уроков =)

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому

      @@olegholostenco8736 я стараюсь публиковать новые видео каждую субботу с утра.

  • @minimalstory
    @minimalstory 2 роки тому +1

    напомнило картинку, где у африканских детей в учебном классе были картонные компы.

  • @shkippitor1895
    @shkippitor1895 2 роки тому

    Спасибо за видео. Когда мы создаем класс Thread, мы создаем прямо отдельный поток или же как бы берем его из ThreadPool? И по поводу работы Task хотелось бы уточнить, получается мы задаем какую то операцию нашей задачи, она арендует поток из ThreadPool, выполняет вычисление, как только вычисление завершено, передает результат исполнения в арендованный поток и затем его снова возвращает в ThreadPool?

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  2 роки тому +1

      Спасибо за комментарий.
      Моё пониманием такое: количество потоков ограничено. Просто если вы берете поток через класс Thread, Вы можете попасть в ситуацию, когда доступных потоков просто не будет и в приложении появится ошибка.
      ThreadPool это как бы надстройка над потоками и он за нас решает проблемы связанные с использованием потоков: "выдает" нам потоки, "забирает" их обратно, когда работа в потоке выполнена.
      Что касается ThreadPool и Task, то между ними разница следующая: при использовании Task Вы всегда знаете когда выполнение задания закончено, а при использовании ThreadPool нет встроенного способа определить закончено ли задание и какое значение было возвращено. Собственно этот недостаток ThreadPool послужил причиной появления концепции Task.
      В .Net есть такое понятие, как TaskScheduler - он отвечает за старт заданий и управляет заданиями в процессе их работы. TaskScheduler использует потоки из ThreadPool. То есть "под капотом" Вы и так используете ThreadPool, но теперь у Вас есть доступ к статусу задания (завершено/не завершено) и если задание завершено, то есть доступ к его результату.

    • @shkippitor1895
      @shkippitor1895 2 роки тому +1

      @@AndreyShyrokoriadov Спасибо за подробное разъяснение)

  • @vael6555
    @vael6555 Місяць тому

    Задействуется ли доп. поток во время исполнения асинхронного метода?

  • @glorglorsky7987
    @glorglorsky7987 2 роки тому +1

    Непонятно про async await, await говорит нам о том, что тут надо дождаться выполнения задачи, и получается поток блокируется , до тех пор пока не будет выполнена задача? А в чем тогда проявляется асинхронность?

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  2 роки тому

      Асинхронность хорошо видно в приложениях с интерфейсом пользователя. Попробуйте скачать файл или данные из веб услуги синхронно в потоке интерфейса пользователя (UI Thread). Приложение будет подвисать. Если программист оставить поток интерфейса пользователя в покое и основную работу приложения будет выполнять асинхронно в отдельных потоках, то приложение не будет подвисать. Когда асинхронная операция будет завершена, интерфейс пользователя буде обновлен. Во время выполнения асинхронной операции пользователь может спокойно взаимодействовать с интерфейсом пользователя и вызывать другие асинхронные операции, например одновременно скачивать или подгружать несколько файлов.

    • @glorglorsky7987
      @glorglorsky7987 2 роки тому

      @@AndreyShyrokoriadov получается задача , например скачивание, или обработка, уйдет в тредпул. А пользователь будет работать с главным потоком?

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  2 роки тому

      @@glorglorsky7987 да, Вы правильно поняли.

  • @IPmen10001
    @IPmen10001 7 місяців тому

    Подскажите пожалуйста никак не могу понять. Есть метод асинхронный в Web API который возвращает какие то данные в методе стоит задержка на 10 сек. Так вот никак не могу понять клиент сразу получит ответ но он будет пустой т.е он получит таску без данных. Или если клиент задержится на странице то данные ему придут через секунд? Спасибо

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  7 місяців тому

      данные придут через "икс" секунд. В это время в интерфейсе пользователя будет какая то анимация символизирующая ожидание. То есть клиент ничего сразу не получит. Он получит данные, как только они будут готовы (после выполнения таска).
      А если таск настолько массивный, что он длится минуты или даже часы, то можно клиенту сразу вернуть статус 201 Accepted (естественно без данных). Когда таск будет выполнен об этом надо как-то проинфирмировать клиента (есть разные способы, например с помощью библиотеки SignalR). Сообщение клиенту будет содержатьинформацию о том, что такс закончился и данные можно скачать без задержек.

    • @IPmen10001
      @IPmen10001 7 місяців тому

      @@AndreyShyrokoriadov спасибо большое за разъяснения 🤝

  • @redice8928
    @redice8928 5 місяців тому

    А как async await раскрывается под капотом, и можно ли получить резалт без использования этих ключевых слов и без блокировки основного потока

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  12 днів тому

      если Вы сделаете .Result то превратите асинхронный метод в синхронный и заблокируете основной поток. Использовать .Result это плохая практика.

  • @MishkinFedor
    @MishkinFedor 3 роки тому +4

    Видео класс! Только не услышал про то в каких потоках выполняются Task. Если я не ошибаюсь, то за это отвечает сам фреймворк. Считается что фреймворк управляет потоками лучше и при использовании Task разработчику не надо думать о потоках.

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому +6

      Спасибо за комментарий и подписку.
      Если у Вас есть выбор что использовать: Thread, ThreadPool или Task, то конечно лучше использовать Task. О разнице между Thread и ThreadPool я по моему говорил в видео, а что касается ThreadPool и Task, то между ними разница следующая: при использовании Task Вы всегда знаете когда выполнение задания закончено, а при использовании ThreadPool нет встроенного способа определить закончено ли задание и какое значение было возвращено. Собственно этот недостаток ThreadPool послужил причиной появления концепции Task.
      В .Net есть такое понятие, как TaskScheduler - он отвечает за старт заданий и управляет заданиями в процессе их работы. TaskScheduler использует потоки из ThreadPool. То есть "под капотом" Вы и так используете ThreadPool, но теперь у Вас есть доступ к статусу задания (завершено/не завершено) и если задание завершено, то есть доступ к его результату.
      После того как я закончу серию видео о C# я планирую выпустить одно большее видео, которое будет называться Errata ("ошибки" на латинском языке) - в этом видео дам более детальные ответы на некоторые вопросы. Пока таких вопросов 3 (на основании комментариев зрителей) и среди них будет Ваш вопрос о том, в каких потоках выполняется Task.

    • @MishkinFedor
      @MishkinFedor 3 роки тому +1

      Хорошо, спс, будем ждать видео

    • @ramil9209
      @ramil9209 2 роки тому

      @@AndreyShyrokoriadov идея супер, такого действительно нет про разбор ошибок

    • @ramil9209
      @ramil9209 2 роки тому

      @@AndreyShyrokoriadov планируете ли вы в будущем снимать уроки по обучению. Net core? Хотелось бы ещё видео о проведении ревью, рефакторинге кода, такое часто дают на собесах

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  2 роки тому +1

      @@ramil9209 видео о .net core уже есть на канале. Видео о ревью и рефакторинге - хорошая идея.

  • @IPmen10001
    @IPmen10001 8 місяців тому

    Есть ли у вас лекция про асинк эвейт?

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  8 місяців тому +1

      На сколько я помню, в моих видео нет видео посвященного исключительно ключевым словам async/await

  • @anonym1548
    @anonym1548 3 роки тому

    Андрей, объясните пожалуйста, как работать с очередью многопоточно.
    Допустим, есть очередь и её необходимо обрабатывать в 5 потоков.
    Как это лучше всего реализовать?
    Знаю есть класс ConcurrentQueue, но как с ним работать многопоточно, я не очень понимаю.
    Спасибо за видео, очень полезное!

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому +1

      Спасибо за подписку и комментарий. Обратите внимание на это видео ua-cam.com/video/Uwo0by4OHjs/v-deo.html - там есть пример использования коллекции ConcurrentQueue. Код в этом видео доступен здесь: github.com/ashyrokoriadov/TelephoneExchange

  • @motojpeg
    @motojpeg 3 роки тому +1

    Ручка с изолентой? Для защиты от претензий бренда?))

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому

      В этом случае я не хотел рекламировать "бренд" :) По сути это ручка с логотипом одного из моих клиентов.

  • @motojpeg
    @motojpeg 3 роки тому

    Такая достаточно тихая и спокойная речь при подаче материалов убаюкивает)))
    А еще походу у Автора запись материала происходит в вечернее время, а тихая речь нужна для того, чтобы не разбудить спящих детей))

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому

      Интересное наблюдение. Вообще у меня просто тихий голос - это имеет свои преимущества и недостатки.

  • @notn9380
    @notn9380 3 роки тому

    Подписался.

  • @SoferPeOZN
    @SoferPeOZN 3 роки тому

    Очень хотелось б узнать про mutex и semaphore от вас 🙂

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  3 роки тому

      Я немного прояснил ситуацию с mutex и semaphore в этом видео ua-cam.com/video/x1ake02sgY0/v-deo.html

  • @awdesawdeska6161
    @awdesawdeska6161 3 роки тому

    Когда видео про обобщённые классы?

  • @Александр-и3й3д

    Чуш, начиная примерно с 8 минуты
    - async не делает метод асинхронным, а даёт возможность запустить в нём асинхронную операцию
    - в нем не обязательно вызвать через await что-то, его можно использовать как обычный метод

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  Рік тому

      С удовольствием посмотрел бы видео с Вашей версией объяснения этой темы, но что-то у Вас на канале пустовато... Для такого претензионального заявления. Кстати словао "чушь" пишется с мягким знаком.

  • @РНС_Саакашвили

    не знаю кто удалил коммент поэтому повторю его

    • @РНС_Саакашвили
      @РНС_Саакашвили Рік тому

      хочу вам подсказать что нужно изменить - с точки зрения начинающего программиста
      .. . вот вы говорите "существует 4 конструктора класса ПОТОК" . . . так вот когда вы излагаете при СИСТЕМНЫЕ конструкторы, свойства, методы, делегаты, расширения - нужно(на примере данного случая) показать на секунду вот эту страничку(тут адрес интернет-страницы Микрософта с одним из 4-х конструкторов потока)
      и продолжать излагать НА ПРИМЕРЕ таких или аналогичных сигнатур
      тогда начинающие будут знать как применить этто или подобное
      . . . ни у одного из блогеров этого нет(хотя некоторые периодически нажимают F12)
      . . . особенно это поможет когда там вообще нет примера - только сигнатура

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  Рік тому

      @@РНС_Саакашвили Хороший и полезный комментарий. Спасибо.

    • @РНС_Саакашвили
      @РНС_Саакашвили Рік тому

      @@AndreyShyrokoriadov тогда будет смотреть ПОИНТЕРЕСНЕЙ - ведь такие методы изложения нигде ни раскрыты(на других ресурсах)

  • @aleksthomson9457
    @aleksthomson9457 2 роки тому

    бумажка и ручка? О_о

  • @krb7159
    @krb7159 2 роки тому

    А как узнать количество потоков в системе?

    • @AndreyShyrokoriadov
      @AndreyShyrokoriadov  2 роки тому

      Если честно, я не знаю и я не никода не задвался этим вопросом. Если потоков не хватает, то наверное задания, которым не хватило, будут в ожидании, когда будут свободные потоки и такие азадания не будут выполняться. Если Вам интересно Вы можете поискать в англоязычной документации по .Net сколькими потоками может одновременно "жонглировать" .Net .

    • @SetAngelGreen
      @SetAngelGreen 11 місяців тому

      У меня возник момент когда на одном ПК многократный вызов одного и того же Task мог выполнять их в разное время независимо друг от друга, а на другом, все Task (вызов одного и того же задания или же разные Task) встали в очередь и ожидали выполнение последовательно.

    • @dy0mber847
      @dy0mber847 11 місяців тому

      ​@@SetAngelGreenсколько у вас ядер на ПК из первого и на ПК из второго случая?