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

Поделиться
HTML-код
  • Опубликовано: 25 дек 2024

Комментарии •

  • @CODEBLOG
    @CODEBLOG  6 лет назад +12

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад

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

  • @vm7738
    @vm7738 Год назад +13

    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

  • @АлександрИванов-б9ю7м

    какие же понятные уроки просто кайф!

  • @OrinokoRiver
    @OrinokoRiver Год назад +2

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

  • @HELIATROS
    @HELIATROS 19 дней назад

    52:30 Можно же сделать Main асинхронным. Объяви async static Task Main(string[] args) и поставь await перед DoWorkAsync(); Тогда вывод будет более последовательный
    Begin Main
    Begin Async
    DoWork
    DoWork
    DoWork
    DoWork
    DoWork
    DoWork
    DoWork
    DoWork
    DoWork
    DoWork
    End Async
    Continue Main
    Main
    Main
    Main
    Main
    Main
    Main
    Main
    Main
    Main
    Main
    End Main

  • @CODEBLOG
    @CODEBLOG  6 лет назад +6

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

    • @Penat_Vilikirentiy
      @Penat_Vilikirentiy 6 лет назад

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

    • @MrBadbolt
      @MrBadbolt 5 лет назад

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

  • @xezdx
    @xezdx 4 года назад +10

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

  • @yuliyazag
    @yuliyazag Год назад

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

  • @xezdx
    @xezdx 4 года назад +28

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

  • @vladisslavss
    @vladisslavss 2 года назад

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

  • @Упырь-н7б
    @Упырь-н7б 4 года назад +1

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

  • @ЛеонидШиринкин-ч8г
    @ЛеонидШиринкин-ч8г 3 года назад +15

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

    • @OlegGalysh
      @OlegGalysh 3 года назад +6

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

    • @73километр
      @73километр 6 месяцев назад

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

    • @gamb5730
      @gamb5730 4 месяца назад

      @@73километр в его соц сетях было давно
      он устроился в майкрософт, сам видел

  • @atler9865
    @atler9865 4 года назад +9

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

  • @Grapeoff
    @Grapeoff 5 лет назад +45

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +9

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

  • @student6842
    @student6842 3 года назад +3

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

  • @Lorienl2master
    @Lorienl2master 3 года назад +5

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

  • @DVA-Play
    @DVA-Play 4 года назад +21

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

    • @benjaminBTN
      @benjaminBTN Год назад

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

    • @olehdumanskyi7830
      @olehdumanskyi7830 8 месяцев назад

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

  • @progfa6934
    @progfa6934 4 года назад +9

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

  • @НикитаКунгурцев-э1щ
    @НикитаКунгурцев-э1щ 5 лет назад +15

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +7

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

  • @АртемЧешихин-з3л
    @АртемЧешихин-з3л 4 года назад +2

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

    • @richarddaniel7088
      @richarddaniel7088 3 года назад

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

    • @АртемЧешихин-з3л
      @АртемЧешихин-з3л 3 года назад +4

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

    • @xxyxungxxraimexx7242
      @xxyxungxxraimexx7242 3 года назад +1

      @@АртемЧешихин-з3л кросс

    • @satanwave
      @satanwave 2 года назад

      @@АртемЧешихин-з3л как успехи?

    • @АртемЧешихин-з3л
      @АртемЧешихин-з3л 2 года назад +1

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

  • @АлексДжаванов
    @АлексДжаванов 5 лет назад +4

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +1

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

  • @sashkosashok
    @sashkosashok 5 лет назад +2

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад

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

    • @sashkosashok
      @sashkosashok 5 лет назад +3

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

  • @pavelchagovskiy6447
    @pavelchagovskiy6447 5 лет назад +2

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

    • @АлексДжаванов
      @АлексДжаванов 5 лет назад

      Бывает

    • @CODEBLOG
      @CODEBLOG  5 лет назад

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

    • @pavelchagovskiy6447
      @pavelchagovskiy6447 5 лет назад +1

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

  • @volodya185
    @volodya185 4 года назад +1

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

  • @alexanderdell2623
    @alexanderdell2623 2 года назад +1

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

  • @BrownAleks
    @BrownAleks 2 года назад

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

  • @alex-rr5mt
    @alex-rr5mt 5 лет назад +8

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

    • @karabasbarabas2000
      @karabasbarabas2000 5 лет назад

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

    • @anonym1548
      @anonym1548 3 года назад

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

    • @alex-rr5mt
      @alex-rr5mt 3 года назад +4

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

    • @anonym1548
      @anonym1548 3 года назад

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

  • @АлексДжаванов
    @АлексДжаванов 5 лет назад +7

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +9

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

  • @oliviacolins6856
    @oliviacolins6856 4 года назад

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

  • @nerub9690
    @nerub9690 4 года назад

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

    • @CODEBLOG
      @CODEBLOG  4 года назад

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

    • @artur8904
      @artur8904 3 года назад

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

    • @VyacheslaveDev69
      @VyacheslaveDev69 2 года назад +3

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

    • @ЕгорКрасный-ь4г
      @ЕгорКрасный-ь4г Год назад

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

  • @АлексДжаванов
    @АлексДжаванов 5 лет назад +1

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +3

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

  • @andreyartemov5410
    @andreyartemov5410 4 года назад

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

    • @CODEBLOG
      @CODEBLOG  4 года назад

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

  • @roman044
    @roman044 4 года назад

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

    • @Упырь-н7б
      @Упырь-н7б 4 года назад

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

    • @roman044
      @roman044 4 года назад

      @@Упырь-н7б да , я понял

  • @daniilohorodnik9777
    @daniilohorodnik9777 4 года назад +8

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

  • @karabasbarabas2000
    @karabasbarabas2000 5 лет назад +2

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +1

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

  • @АлексейЗакалюжный-у1ч

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад

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

    • @АлексейЗакалюжный-у1ч
      @АлексейЗакалюжный-у1ч 5 лет назад

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

  • @june3878
    @june3878 2 года назад

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

  • @oleguna1403
    @oleguna1403 Год назад

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

  • @abdusamadjuraev2615
    @abdusamadjuraev2615 4 года назад

    круто!

  • @АлексейМелентьев-ч3в

    Спасибо

  • @rKvinty
    @rKvinty 4 года назад

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

  • @minoddein7205
    @minoddein7205 2 года назад

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

  • @а00-ь4н
    @а00-ь4н 2 года назад

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

  • @razor23Ukraine
    @razor23Ukraine 5 лет назад +9

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

  • @jeb_7749
    @jeb_7749 4 года назад

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

  • @АнтонПлатонов-о2п
    @АнтонПлатонов-о2п 3 года назад

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

  • @juliusmalkov9620
    @juliusmalkov9620 6 лет назад +5

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

  • @ВалерийВаланчус
    @ВалерийВаланчус 5 лет назад

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад

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

  • @ТомараСемёновна-х2и

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

  • @Nikita9cnjhgfdhbbvgyuj
    @Nikita9cnjhgfdhbbvgyuj 5 лет назад +3

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

  • @dunissimo
    @dunissimo 4 года назад +1

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

  • @ivanomelchenko1895
    @ivanomelchenko1895 4 года назад

    вроде пучком

  • @andreykorobov5074
    @andreykorobov5074 Год назад

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

  • @nekosora6036
    @nekosora6036 4 года назад +1

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

  • @АлексейМелентьев-ч3в

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

  • @TheCrossfor
    @TheCrossfor 5 лет назад

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

    • @CODEBLOG
      @CODEBLOG  5 лет назад +1

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

  • @Евгений-ю9и7с
    @Евгений-ю9и7с Год назад

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

  • @ivanomelchenko1895
    @ivanomelchenko1895 4 года назад

    ++++

  • @ДеловойПун
    @ДеловойПун 3 года назад

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

  • @andreykorobov5074
    @andreykorobov5074 Год назад

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

    • @NaNaNaS_000
      @NaNaNaS_000 Год назад +1

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

    • @mechanism-o4h
      @mechanism-o4h 5 месяцев назад

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

  • @СергейВизгалов-м6е
    @СергейВизгалов-м6е 4 года назад

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

  • @ДеловойПун
    @ДеловойПун 3 года назад

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

  • @xice111
    @xice111 5 лет назад

    Очень тошно

  • @ДеловойПун
    @ДеловойПун 3 года назад

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

  • @ivanomelchenko1895
    @ivanomelchenko1895 4 года назад

    +++