Асинхронность (async, await) и многопоточность (thread) в C# - Учим Шарп #17

Sdílet
Vložit
  • čas přidán 13. 01. 2019
  • Асинхронность(async, await) и многопоточность (thread) в языке программирования C#
    На этом занятии мы познакомимся с понятиями конкурентность, параллельность, многопоточность, асинхронность в языке программирования C#. Научимся создавать новые потоки (thread), а также работать с задачами (task) с помощью асинхронных операций async и await.
    -----------
    ПОДПИШИСЬ на соцсети:
    🔴 TELEGRAM: bit.ly/tg_codeblog
    🔴 VK: bit.ly/vk_codeblog
    🔴 INSTAGRAM: bit.ly/inst_codeblog
    🔴 Яндекс Дзен: bit.ly/zen_codeblog
    🔴 FACEBOOK: bit.ly/fb_codeblog
    🔴 TWITTER: bit.ly/twit_codeblog
    🔴 Мой блог: bit.ly/site_codeblog
    -----------
    ПОДДЕРЖИ развитие CODE BLOG:
    💲 Донат: bit.ly/donate_codeblog
    💲 Спонсорство: bit.ly/patreon_codeblog
    -----------
    СМОТРИ мои обучающие курсы:
    👉 УЧИМ ШАРП: bit.ly/cs_codeblog
    👉 ПРАКТИЧЕСКИЙ ИНТЕНСИВ #1: bit.ly/fit_codeblog
    👉 ПРАКТИЧЕСКИЙ ИНТЕНСИВ #2: bit.ly/crm_codeblog
    👉 СТРУКТУРЫ ДАННЫХ: bit.ly/ds_codeblog
    👉 АЛГОРИТМЫ СОРТИРОВКИ: bit.ly/sort_codeblog
    👉 ОТВЕТЫ НА ВОПРОСЫ: bit.ly/faq_codeblog
    👉 IT ПЕРЕОЗВУЧКА: bit.ly/resound_codeblog
    👉 НЕЙРОННАЯ СЕТЬ: bit.ly/ai_codeblog
    👉 ПАТТЕРНЫ ПРОЕКТИРОВАНИЯ: bit.ly/pattern_codeblog
    👉 CODE REVIEW: bit.ly/review_codeblog
    👉 CLR via C#: bit.ly/clr_codeblog
    -----------
    Кстати, меня зовут Шванов Вадим, и я профессиональный .NET разработчик с 2011 года и автор этого канала CODE BLOG. Я рассказываю про IT технологии и веду абсолютно бесплатный курс по языку C# с нуля. В его рамках мы рассмотрим как базовый синтаксис языка C Sharp, так и его практическое применение и специальные технологии, такие как ASP .NET, .NET Core, ASP.NET MVC, Unity, WPF, структуры данных и алгоритмы, с#, dotnet, паттерны проектирования, информатика, csharp, программное обеспечение и многое другое. Для меня важно не только показать практическое применение языка си шарп, но и объяснить основную идею и базовые понятия Computer Science. В качестве основного инструмента разработки используется Visual Studio c# и проекты на Visual c#. Если вам нравятся такие каналы как хауди хо, айти борода, Soer или ExtremeCode, то здесь вам точно понравится.
    -----------
    #codeblog #программирование #csharp #ityoutubersru #программист #разработка

Komentáře • 110

  • @CODEBLOG
    @CODEBLOG  Před 5 lety +12

    На этом занятии мы познакомимся с понятиями конкурентность, параллельность, многопоточность, асинхронность в языке программирования C#. Научимся создавать новые потоки (thread), а также работать с задачами (task) с помощью асинхронных операций async и await.

    • @CODEBLOG
      @CODEBLOG  Před 5 lety

      @GOGOGO GOGOGO Может быть оговорился. По сути да, мы берем готовый поток из пула и помещаем туда задачу на выполнение. Но это можно также расценивать не как физическое создание, а использование уже созданного, введение в использование, по сути добавление нового асинхронного потока, скорее всего я имел ввиду это под созданием.

  • @vm7738
    @vm7738 Před rokem +11

    0:00 введение
    4:58 конкурентность
    6:27 параллельность
    8:37 многопоточность
    11:33 асинхронное программирование 1
    13:07 чат 1
    15:36 асинхронное программирование 2
    21:04 практика
    22:35 чат 2
    24:07 практика многопоточность 1
    25:36 перезапуск трансляции
    29:41 практика многопоточность 2

  • @user-ej3lt6ne6j
    @user-ej3lt6ne6j Před 3 lety +1

    Спасибо за обучающий стрим! Ваш блог очень сильно мне помог)) Респект)

  • @user-mv9ek1rm7i
    @user-mv9ek1rm7i Před 10 měsíci +2

    Вадим, у тебя классные уроки! Хоть и давно это уже было. Спасибо тебе!

  • @xezdx
    @xezdx Před 3 lety +10

    Кроме того не стоит путать concurrent и parallel. Parallel означает, что код выполняется фактически одновременно, например, двумя процессорами, а concurrent переключает ветки, в то время как каждая из них работает только в отведенное ей время, а потом засыпает, уступая место другой ветке.

  • @vladisslavss
    @vladisslavss Před rokem

    Спасибо за труд!
    лукас и коммент в поддержку канала!

  • @xezdx
    @xezdx Před 3 lety +28

    Про асинхронность, извини, ты совсем не о том говоришь что нужно людям знать. Асинхронные задачи вполне могут быть важными и связанными со всей остальной программой. Дело не в том, что где-то "параллельно" что-то делается в другом потоке из thread pool - совершенно не важно как технически виртуальная машина это делает. Смысл в том, что в синхронном режиме все команды выполняются последовательно, и если будет команда которая выполняется долго (типа получения данных по сети), то это будет замедлять работу программы, так как нужно дождаться выполнения. Асинхронность в свою очередь предполагает, что не дожидаясь выполнения функции программа выйдет из нее и пойдет дальше, затем вернется к выполнению когда данные будут готовы. Поэтому проблем с общими ресурсами, доступом к общей памяти и т.п. нет, потому что выполняется НЕ ПАРАЛЛЕЛЬНО, а просто в другой последовательности.

  • @progfa6934
    @progfa6934 Před 4 lety +9

    Кстати, метод Main можно сделать Асинхронным!
    Только нужно заменить возращаемое значение void на Таску))
    Пример:
    static async Task Main()
    {
    await Task.Delay(2000);
    Console.WriteLine("Ждал 2 секунды, лол");
    await Task.Delay(5000);
    Console.WriteLine("А теперь 5 сек)");
    Console.ReadKey();
    }
    Что-то на подобии этого)

  • @yuliyazag
    @yuliyazag Před 9 měsíci

    каждое видео смотрю с интересом

  • @Lorienl2master
    @Lorienl2master Před 3 lety +5

    Для епилептиков можете после когда вывода поставить Thread.Sleep(400); будет по медленее все выводиться

  • @Grapeoff
    @Grapeoff Před 4 lety +45

    Кто первый встал - того и папки! Тот и папка! Тьфу, того и тапки!!!

    • @CODEBLOG
      @CODEBLOG  Před 4 lety +9

      Да, поржал ) даже у себя в вк этот момент отдельно опубликовал )

  • @user-ed2nx6fk2y
    @user-ed2nx6fk2y Před 2 lety +15

    2 года уже прошло, не знаю, увидел ли ты уже, но код в vs можно форматировать сочетанием ctrl + k + d. Он сам ставит пробелы (внутри циклов, например), отступы добавляет или убирает, в зависимости от вложенности

    • @OlegGalysh
      @OlegGalysh Před 2 lety +7

      Вадим уже стал разработчиком Microsoft, думаю он уже узнал об этом)) Жаль, что видео перестал делать (

    • @user-qq3ju9bc9k
      @user-qq3ju9bc9k Před 8 dny

      А откуда информация?​@@OlegGalysh

  • @atler9865
    @atler9865 Před 4 lety +8

    Кто смотрит на 29:45, после перезапуска, перестанет мерцать. Не расходимся!)))

  • @user-vg6gu8hc6w
    @user-vg6gu8hc6w Před 4 lety +4

    Вадим тебе нужно перепаять контакты ! у меня тоже так было на старом ламповом телевизоре в детстве когда любимый ну погоди смотрел ...

    • @CODEBLOG
      @CODEBLOG  Před 4 lety +1

      Не, это не контакты. потом уже разобрался )

  • @DVA-Play
    @DVA-Play Před 4 lety +21

    Резануло по ушам: "Что бы не думали что я богатый"
    Быть богатым это нормально! Спасибо за урок!

    • @benjaminBTN
      @benjaminBTN Před 8 měsíci

      Особенно духовно богатым быть нормально, но разве кто-то сейчас под словом «богатство» это подразумевает...

    • @olehdumanskyi7830
      @olehdumanskyi7830 Před 2 měsíci

      @@benjaminBTN Глубина мысли на уровне "как жаль, что под словом велосипед никто не подразумевает табуретку"

  • @student6842
    @student6842 Před 2 lety +3

    Спасибо.
    29:02 Примеры кода

  • @abdusamadjuraev2615
    @abdusamadjuraev2615 Před 4 lety

    круто!

  • @user-se2gv5bd6w
    @user-se2gv5bd6w Před 5 lety +15

    Асинхроность != Паралелльность

    • @CODEBLOG
      @CODEBLOG  Před 5 lety +7

      Именно так, и насколько я помню я об этом и говорил в начале видео

  • @user-mn2po8ns2z
    @user-mn2po8ns2z Před 3 lety

    Спасибо

  • @user-co5op7sz2z
    @user-co5op7sz2z Před 3 lety +2

    Ищу работу на Джуна, решил изучить вопрос о многопоточности, думаю это сыграет мне в плюс на собеседовании)

    • @richarddaniel7088
      @richarddaniel7088 Před 3 lety

      Ну как, сыграло?))

    • @user-co5op7sz2z
      @user-co5op7sz2z Před 3 lety +4

      @@richarddaniel7088 да, 5ый месяц пошел в должности младшего-фуллстека)

    • @xxyxungxxraimexx7242
      @xxyxungxxraimexx7242 Před 3 lety +1

      @@user-co5op7sz2z кросс

    • @satanwave
      @satanwave Před 2 lety

      @@user-co5op7sz2z как успехи?

    • @user-co5op7sz2z
      @user-co5op7sz2z Před 2 lety +1

      @@satanwave охуенно, 9 дней без выходных, с переработками под 20 часов и все равно дедлайн на пару дней просрали, благо заказчик не ругался совсем

  • @user-cy5dj7sk7f
    @user-cy5dj7sk7f Před 4 lety

    Добрый день. Подскажите мне, пожалуйста, можно ли метод сразу описывать как асинхронный? Или всегда сначала нужно создавать синхронный метод, а потом при необходимости делать его асинхронным?

    • @CODEBLOG
      @CODEBLOG  Před 4 lety

      конечно же можно ) если заранее знаешь, что он таким будет, то можно писать сразу )

    • @user-cy5dj7sk7f
      @user-cy5dj7sk7f Před 4 lety

      Спасибо за ответ. А как в данном случае будет выглядеть структура метода? Если здесь мы вызываем уже существующий метод через await, то где будет это слово стоять в рассматриваемом случае? И ответьте, пожалуйста, еще на один вопрос: есть ли у Вас занятие, посвященное работе с Git? Пролистал плейлист, но не увидел. Может, просто плохо смотрел...

  • @andreyartemov5410
    @andreyartemov5410 Před 4 lety

    Подскажите с lock запутался,два класса записывают в один фаил разные данные в 2 потока, так как одновременно их обратиться к файлу они не могут по идее надо один залочить. Я для этого объявляю как на вашем примере object lock в первом классе и object lock во втором классе и выделяю локом цикл который записывает данные в фаил... вот как я понимаю- кто первый из потоков добрался до лока тот и за лочился до тех пор пока не закончит... правильно????

    • @CODEBLOG
      @CODEBLOG  Před 4 lety

      должен быть один объект синхронизации. когда один начал записывать в файл, второй будет ждать завершения. как в пословице - кто первый встал, того и тапки :)

  • @sashkosashok
    @sashkosashok Před 4 lety +2

    Ryzen one love. Буду покупать себе новый комп, возьму райзен.

    • @CODEBLOG
      @CODEBLOG  Před 4 lety

      почему? он не глючит так?

    • @sashkosashok
      @sashkosashok Před 4 lety +3

      @@CODEBLOG Не знаю даже на сколько Райзены глючные. Смотрел пару обзоров, вроде все нормально. AMD своей ценой при сопоставимой мощности сейчас хорошо напихала среднему классу интеловских процов. А интеловские топы на мой взгляд всегда были сильно оверпрайсд. Я сделал вывод, что серия Ryzen вышла очень хорошей учитывая стоимость и потому когда понадобится обращу на них внимание. Да и есть во мне дух борьбы против монополистов. Особенно когда оппозиция делает качественный продукт)

  • @nerub9690
    @nerub9690 Před 4 lety

    Есть ли ролик, по требованиям от работодателей к программистам С# разных уровней ?И по каким параметрам определяется уровень программиста ?

    • @CODEBLOG
      @CODEBLOG  Před 4 lety

      Пока нет, но будет )

    • @artur8904
      @artur8904 Před 2 lety

      @@CODEBLOG есть уже?)

    • @VyacheslaveDev69
      @VyacheslaveDev69 Před rokem +3

      @@artur8904 Вадим принял ислам, уже ничего не будет

    • @user-lp1ir6qr2w
      @user-lp1ir6qr2w Před rokem

      @@VyacheslaveDev69 ушёл работать в Microsoft)

  • @oliviacolins6856
    @oliviacolins6856 Před 4 lety

    Доброго времени суток! Подскажите каким образом можно исправить ошибку ниже... используя Асинхронный метод (async/await)
    когда Запускаем поток таким образом - все работает
    new Thread(() =>
    {
    Invoke((MethodInvoker)(() =>
    {
    //тут выполняем код
    }));
    }).Start();
    *******************************
    Когда вызываю асинхронный метод выдается ошибка, как ее исправить?
    async Task MetodAsync()
    {
    await Task.Run(()=>
    {
    //тут выполняем код
    }
    );
    }
    Выходит ошибка:
    System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'label1' не из того потока, в котором он был создан."

  • @user-vg6gu8hc6w
    @user-vg6gu8hc6w Před 4 lety +1

    К вечеру вроде разобрался )
    Но при всем великом уважении к Вадиму
    Примеры в уроки далеко не самые удачные (((
    ВАДИМ И МОЖНО ВОПРОС
    что значит повышенный приоритет ? р нем в видео рассказывалось ?

    • @CODEBLOG
      @CODEBLOG  Před 4 lety +3

      Ну да, возможно и не лучшие ) потом может быть еще сниму, да и в CLR Эта тема будет рассматриваться.
      а по поводу приоритета, то важно понимать, что ресурсы системы ограничены, и доступ осуществляется на конкурентной основе. Например, вычисления процессора. ОС решает сама, какой именно процесс выполнять в каждый момент времени, управляет очередями и т.д. и если задать приоритет, то вероятность первичного выполнения - повышается, но не гарантируется.

  • @pavelchagovskiy6447
    @pavelchagovskiy6447 Před 4 lety +2

    Здравствуйте, мастер. Я разбираюсь с клиент серв приложениями и параллельно с многопоточностью. Сделал тестовую программу, обращающуюся в к элементу формы в потоке. В результате при закрытии попадаю в исключение "Доступ к ликвидированному объекту невозможен.
    Имя объекта: "Form1"."
    . Я могу конечно его отловить ,но.... Пытался заключать invoke в проверку на IsDisposed (Существование формы)... Не помогло. Еще раз спасибо Вам большое за все.

    • @user-vg6gu8hc6w
      @user-vg6gu8hc6w Před 4 lety

      Бывает

    • @CODEBLOG
      @CODEBLOG  Před 4 lety

      Да, есть такая ошибка часто. И решить её достаточно сложно. в целом нужно правильно выстроить процесс завершения и прерывания потока. Смысл в том, что поток еще выполняется, а форма уже закрыта, но из памяти еще не удалена. нужно сначала остановить поток, а потом уже закрывать форму

    • @pavelchagovskiy6447
      @pavelchagovskiy6447 Před 4 lety +1

      @@CODEBLOG У меня в отдельном потоке запускается бесконечный цикл. Я завел переменную флаг, при закрытии формы ставлю ее в false, что как будто бы должно обеспечить выход из цикла и соответственно закрытие потока, так как в нем больше ничего нет. Но увы все равно получаю ошибку при закрытии, о том что объект уничтожен. Помогает только остановка потока -

  • @BrownAleks
    @BrownAleks Před rokem

    35:36 чем плох такой вот вариант?
    Thread thread2 = new Thread(() => DoWork2(int.MaxValue));

  • @user-vg6gu8hc6w
    @user-vg6gu8hc6w Před 4 lety +7

    Сложновато , мой мозг с первого раза не особо проникся данной темой (

    • @CODEBLOG
      @CODEBLOG  Před 4 lety +9

      А тема очень важная. Прям очень-очень!

  • @alexanderdell2623
    @alexanderdell2623 Před rokem +1

    28:47 закончились лаги и начались обьяснение наконец

  • @alex-rr5mt
    @alex-rr5mt Před 5 lety +8

    Чувак, если приходится много работать со строками, то лучше, нет, даже необходимо(!) юзать StringBuilder. В твоём примере это относится к тому месту, где ты хотел 100000 раз прибавлять рандомное число к строке

    • @lexaznaurov5205
      @lexaznaurov5205 Před 4 lety

      делал и так и так. StringBuilder сработал даже не в 2 или 3 раза, а на порядок быстрее.

    • @anonym1548
      @anonym1548 Před 3 lety

      А всё из-за того, что строка это значимый тип и при каждом изменении строки происходит выделение памяти и прочие расходные операции.
      Стрингбилдер работает иначе, поэтому он быстрее, но быстрее, только в том случае, если строк реально много.
      Если строк мало, в скорости он может и проиграть.

    • @alex-rr5mt
      @alex-rr5mt Před 3 lety +4

      @@anonym1548 строка это ссылочный тип, не значимый.

    • @anonym1548
      @anonym1548 Před 3 lety

      @@alex-rr5mt спасибо за поправку.
      Верно, конечно же ссылочный.

  • @CODEBLOG
    @CODEBLOG  Před 5 lety +6

    25:40 - Начало отладки видео​. Дальше 3 минуты можно вообще не смотреть. Прошу прощения за технические неполадки
    28:30 - Перемотать сюда. Лаги видеокарты закончились. Оказалось SLI с OBS вообще не дружит...

    • @Penat_Vilikirentiy
      @Penat_Vilikirentiy Před 5 lety

      Хороший урок, хорошо что неполадки как раз выпали на теорию) Спасибо что выложили!

    • @MrBadbolt
      @MrBadbolt Před 5 lety

      1070 в слай и обс не дружат? в ходе последних событий с серией 2080 вопрос о покупке второй 1070 для стрима отпал :D

  • @rKvinty
    @rKvinty Před 3 lety

    А у меня метод Main может быть асинхронным. :)

  • @daniilohorodnik9777
    @daniilohorodnik9777 Před 3 lety +8

    Эпилептики покинули чат

  • @minoddein7205
    @minoddein7205 Před rokem

    Проблематично, конечно, интегрировать асинхронность и многопоточность в свою предметную область.

  • @user-dh7bf2jz1c
    @user-dh7bf2jz1c Před 2 lety

    Очень сложно но все равно спасибо

  • @user-mj9lm8fl1d
    @user-mj9lm8fl1d Před rokem

    C# 7.1 добавили асинхронный метод мейн

  • @jeb_7749
    @jeb_7749 Před 3 lety

    Застрял на этой теме. Чтобы разобраться, сейчас читаю "Современные операционные системы" 😒

  • @oleguna1403
    @oleguna1403 Před rokem

    Ничего себе лысину отполировал, хорошо объясняешь.

  • @volodya185
    @volodya185 Před 4 lety +1

    Блин, перепроверял себя много раз! Цикл выполняется, пока условие верно! А значит м2 не выполнится и никакой борьбы не будет! Не знаю, что там на гитхабе, но в конце видео м2 неверный!

  • @roman044
    @roman044 Před 3 lety

    Почему метод , где возвращаемое значение Task не требует return ?

    • @user-ej3lt6ne6j
      @user-ej3lt6ne6j Před 3 lety

      Судя по тому что в одном из примеров, где возвращаемое значение должно быть Task, а по факту было просто bool, то просто Task = void

    • @roman044
      @roman044 Před 3 lety

      @@user-ej3lt6ne6j да , я понял

  • @june3878
    @june3878 Před 2 lety

    как заблочить поток в асинхронном методе?

  • @user-nv4yz5bt4g
    @user-nv4yz5bt4g Před 4 lety

    У вас работаю 2 камеры через USB . У одной камеры контакт USB не достаточно плотный . У меня так отключается внешний диск в момент копирования (наверно USB шнур износился или гнездо USB . Можно поменять гнездо) .

    • @CODEBLOG
      @CODEBLOG  Před 4 lety

      Не, там было дело не в камере, а в sli он с приложением для трансляций не дружит к сожалению

  • @user-qt8ow7yl8i
    @user-qt8ow7yl8i Před 5 lety +3

    В примере блокировки никто никого не блокирует.

  • @juliusmalkov9620
    @juliusmalkov9620 Před 5 lety +5

    )))) паинт зло)

  • @lexaznaurov5205
    @lexaznaurov5205 Před 4 lety +2

    Быстро обернуть кусок кода в регион - выделить кусок, ПКМ - Snippet - Surround With - region. Там много во что можно обернуть: в регион, в if, for, forech, class и тд
    Вопрос - сколько потоков можно создавать? сколько хочется? это имеет смысл для ускорения работы приложения? ну типа у нас же 4-8 ядерные процессоры, сколько то потоков могут ускорить работу? Или потоки это не об том?

    • @CODEBLOG
      @CODEBLOG  Před 4 lety +1

      Привет, потоки можно создавать по желанию, но это медленный процесс, поэтому его нужно делать осознано. Лучше использовать threadpool, оттуда потоки вызываются значительно быстрее. Иногда распараллеливание может даже замедлить выполнение, поэтому лучше хорошо все обдумать, оценить и протестировать

  • @ivanomelchenko1895
    @ivanomelchenko1895 Před 4 lety

    вроде пучком

  • @TheCrossfor
    @TheCrossfor Před 5 lety

    а можно же было просто сделать метод записи в файл асинхронным, а саму запись отдать таску в теле и не писать лишнего на 53 строке? или это плохая практика?)
    async bool SaveFile(string path)
    {
    await Task.Run(() => { // запись });
    return true;
    }

    • @CODEBLOG
      @CODEBLOG  Před 5 lety +1

      Зависит от того, где ты будешь это использовать. Вообще уже есть готовые методы async записи в файл ) а также нужно подумать, чтобы не было конфликтов при записи файл из разных потоков. но сильно страшного в таком коде я не вижу, за исключением того, что никогда не вернется false )

  • @razor23Ukraine
    @razor23Ukraine Před 5 lety +9

    Ну....сумбурненько как-то получилось....выглядит неподготовленным.
    Очень много времени, а информации охвачено не так много.
    Но в целом, спасибо. В русскоязычном ютубе информации не так и много!

  • @ivanomelchenko1895
    @ivanomelchenko1895 Před 4 lety

    +++

  • @ivanomelchenko1895
    @ivanomelchenko1895 Před 4 lety

    ++++

  • @user-gy4pg5dg8k
    @user-gy4pg5dg8k Před rokem

    ♥ Спасибо за видео! Нашел видео с примером создания программы с многопоточностью czcams.com/video/X5AxuT5tbZ4/video.html ☻

  • @user-mn2po8ns2z
    @user-mn2po8ns2z Před 3 lety

    пример конечно не очень, про ящик и сотку

  • @dunissimo
    @dunissimo Před 3 lety +1

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

  • @nekosora6036
    @nekosora6036 Před 3 lety +1

    Эпилептикам не смотреть!!1

  • @andreykorobov5074
    @andreykorobov5074 Před rokem

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

  • @user-vg8on1vq8c
    @user-vg8on1vq8c Před 3 lety

    Если бы ты потратил бы 15 минут перед трансляцией, то ты бы предоставил бы весь материл за 30 минут вместо 1.5 часа. Экономия в два раза.

  • @user-cf5ku1hh6b
    @user-cf5ku1hh6b Před 4 lety

    не реально смотреть с етим миганием

  • @xice111
    @xice111 Před 4 lety

    Очень тошно

  • @user-bs5te4fp1w
    @user-bs5te4fp1w Před rokem

    Человек совершенно не понимает разницу между асинхронностью и многопоточностью...

  • @user-vg8on1vq8c
    @user-vg8on1vq8c Před 3 lety

    Ни подготовки, ни плана, ни сценария.

  • @andreykorobov5074
    @andreykorobov5074 Před rokem

    Не тратьте время, найдите чей ни будь другой урок на эту тему... товарищ всё рожает на лету из головы, к материалу не готов и плавает.

    • @NaNaNaS_000
      @NaNaNaS_000 Před rokem +1

      Мне всё нравится. Это у тебя что-то с головой

  • @user-vg8on1vq8c
    @user-vg8on1vq8c Před 3 lety

    20 минут в видео руками размахивал и трепался.
    Это как 20 минут рассказывать какие тортики вкусные, а потом только приступать пробовать.
    Зачем тратить время?