Использование асинхронного кода (async / await) в C# в Unity. Разбираем на примерах

แชร์
ฝัง
  • เผยแพร่เมื่อ 30 ก.ค. 2024
  • Для тех, кто еще не знаком с асинхронным кодом, у кого все руки не доходят разобраться с async и await, как и где их использовать, и почему async/await лучше корутин - новое видео! Как обычно с примерами, с толком, с расстановкой!
    Кстати, лайки и донаты волшебным образом ускоряют процесс записи новых видео!
    __________
    Залетай в Таверну Разработчика в телеге, и делись своими траблами в Unity, вместе разбираться будем!
    t.me/gamedevtavern
    Подписывайся на канал в телеге, или на твиттер, там я публикую коротенькие типсы и практики, которые помогут писать код лучше, понятнее и эффективнее:
    Telegram: t.me/gamedevlavka
    Twitter: / gamedevlavka
    Twitter (личный): / vavilichevgd
    0:00 Вступление
    0:35 Смотрим на Coroutine
    3:27 Меняем Coroutine на async/await
    6:22 Как сделать очередь из async/await
    9:38 Как вернуть значение из асинхронного метода
    13:21 Как подождать выполнение всех асинхронных методов

ความคิดเห็น • 46

  • @viktorkobylyanskyy102
    @viktorkobylyanskyy102 2 ปีที่แล้ว +9

    Топовый канал, нужно больше просмотров, Очень структурно и понятно все спасибо вам.

  • @RimuruDev
    @RimuruDev ปีที่แล้ว +1

    Интересная тема. С нетерпением ждем продолжение.

  • @user-sp5zo9nv7d
    @user-sp5zo9nv7d 2 ปีที่แล้ว +9

    Спасибо за видео! Если есть возможность, затрагивайте больше паттернов, пожалуйста

  • @pepsiCharp
    @pepsiCharp 22 วันที่ผ่านมา +1

    Бро, отлично!!!

  • @trytowinunity1445
    @trytowinunity1445 2 ปีที่แล้ว +4

    Спасибо за видео и объяснение ;) ты очень помогаешь развивать мозг!)

  • @antonpashkevich5061
    @antonpashkevich5061 ปีที่แล้ว +2

    Спасибо, реально объясняешь легко и просто.
    Даже я понимаю :3

  • @user-jz6cq2gp8z
    @user-jz6cq2gp8z 2 ปีที่แล้ว +1

    Топ. Спасибо большое!

  • @user-it9mg3ge6p
    @user-it9mg3ge6p 2 ปีที่แล้ว +1

    давно хотел начать разбираться с асинхронностью:)

  • @astyd256
    @astyd256 2 ปีที่แล้ว

    Спасибо за видео всё очень понятно объяснил!

  • @samserious5483
    @samserious5483 ปีที่แล้ว +1

    Привет, спасибо за видео, познавательно! Но уже пора продолжение выкатывать:)) Как их грамотно завершать и как вообще их лучше использовать, кейсы

  • @Fenix72rus
    @Fenix72rus 2 ปีที่แล้ว +2

    Очень полезный урок. Спасибо!

    • @Fenix72rus
      @Fenix72rus 2 ปีที่แล้ว +2

      Жду урок про остановку

  • @psy_gamer
    @psy_gamer 2 ปีที่แล้ว +2

    Ролик отличный!
    Но я ждал именно завершение выполнения асинхронного метода!)

  • @def6141
    @def6141 2 ปีที่แล้ว +3

    Класс но тема сисек не раскрыта, нужно продолжение👍

  • @PS-vj6jz
    @PS-vj6jz 2 ปีที่แล้ว +2

    Да, паттерны это хорошо. Видео хорошие. Было бы больше подписчиков)

  • @ilya1639
    @ilya1639 10 หลายเดือนก่อน +1

    Если Task.Yield не равен deltaTime, то как это поправить?

  • @user-ml5tn8qn8j
    @user-ml5tn8qn8j 2 ปีที่แล้ว +2

    Я конечно не эксперт, но не понял чем же это лучше корутинов (код явно не стал проще и меньше)

  • @shtolyan
    @shtolyan ปีที่แล้ว +2

    Не понял только как происходит работа с Monobehaviour из других потоков. Почему код работает?

    • @gamedevlavka
      @gamedevlavka  ปีที่แล้ว +2

      Потому что это на самом деле не многопоточность в прямом смысле слова. Это "многопоточность". Я зря об этом не упомянул, но это специальный юнитевский async/await, который имитирует многопоточность, но на самом деле работает в основном потоке юнити. Так называемый синтаксический сахар. Грубо говоря, чтобы заменить костыльные корутины, добавили костыльный async/await

  • @xagent
    @xagent ปีที่แล้ว

    можете сделать видео про UniTask? На собеседованиях несколько раз спрашивали про них, а инфы немного

  • @ivanfilatov5482
    @ivanfilatov5482 10 หลายเดือนก่อน

    А что за плагин показывает имена переменных в вызове функций? Платный?

  • @luckyrider1
    @luckyrider1 2 ปีที่แล้ว +1

    async/await не многопоточный. Проверить потоки можно выведя в лог id текущего потока в котором работает метод Thread.CurrentThread.ManagedThreadId

  • @user-qb8lx2uq5j
    @user-qb8lx2uq5j 2 ปีที่แล้ว

    В документации написано, что когда в процедуре встречается await, то компилятор способен понять, что она асинхронная. Модификатор async был введен лишь для поддержки кода до 5 версии C#, чтобы разрешенные тогда идентификаторы await в таком коде продолжили работать. Типа теперь async однозначно приказывает компилятору воспринимать await как ключевое слово, а не идентификатор.

  • @AndreyDioX2000
    @AndreyDioX2000 2 ปีที่แล้ว +3

    Самый главный вопрос: когда ждать продолжение про async await?

  • @kitws
    @kitws 2 ปีที่แล้ว +2

    Большое спасибо! Жаль без подробностей про Task.Yield и завершение вторичных потоков в Unity...

    • @gamedevlavka
      @gamedevlavka  2 ปีที่แล้ว +4

      Будет в отдельном видео

  • @toxicknight3079
    @toxicknight3079 ปีที่แล้ว

    Уже год прошел, а видео с продолжением этой темы так и не появилось(

  • @mistertwink
    @mistertwink 9 หลายเดือนก่อน

    Я понимаю, что видео вышло год назад, но вдруг. Есть вопрос по поводу использования этого метода. Я реализовываю кликер, где по нажатию на кнопку улучшения начинают автоматически начисляться очки, для этого использую как раз асинк эвейт, но если на ту же кнопку нажать снова, то счетчик прибавляется очень неравномерно. Таск дэлей у меня секунда. При первом нажатии раз в секунду начисление. При втором и последующих нажатиях получается совсем не секунда, а как-то прерывисто. Может, кто-то подскажет, в какую сторону думать

    • @gamedevlavka
      @gamedevlavka  9 หลายเดือนก่อน

      Похоже у тебя запускается ещё одна процедура, когда ещё первая работает, нужна проверка

    • @mistertwink
      @mistertwink 9 หลายเดือนก่อน

      @@gamedevlavka ого, спасибо за ответ. Наверняка так и есть, потому что асинхронный метод вызывается заново, как я понимаю. Но к сожалению не понимаю, как остановить первый метод и тут же снова запустить его с уже новыми значениями переменных...

    • @Bushido_Cat
      @Bushido_Cat 25 วันที่ผ่านมา

      @@mistertwink Task t1 = Task.Run(function).ContinueWith((t1) =>
      {
      logik
      }, TaskScheduler.FromCurrentSynchronizationContext());
      await t1;

  • @user-hk7qf9wl1m
    @user-hk7qf9wl1m 11 หลายเดือนก่อน

    Корутины, о которых говорилось в видео.
    th-cam.com/video/kc-2X_HmtUM/w-d-xo.htmlsi=ITXyG8o6cduPK86d

  • @CiTRyS32
    @CiTRyS32 2 ปีที่แล้ว +6

    Это ж копия видео Tarodev по сути, не похоже на вас.
    Стоило бы добавить, что стандартный async/await может и замена корутинам, но только в разовых операциях, на потоке он в несколько десятков раз медленнее и нужно использовать оптимизированный uniTask

    • @gamedevlavka
      @gamedevlavka  2 ปีที่แล้ว +3

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

    • @user-qb8lx2uq5j
      @user-qb8lx2uq5j 2 ปีที่แล้ว

      Что-то сомнительно, что нативный async/await медленнее корутин. Как раз наоборот должно быть, корутины это костыль, имитирующий асинхронность, пока юнити не поддерживал async в C#. Где можно про это узнать подробнее? Я погуглил и не нашел ничего про "медленнее в десятки раз".

    • @CiTRyS32
      @CiTRyS32 2 ปีที่แล้ว

      @@user-qb8lx2uq5j Держи th-cam.com/video/gcj3kdFa16I/w-d-xo.html

    • @user-qb8lx2uq5j
      @user-qb8lx2uq5j 2 ปีที่แล้ว

      @@CiTRyS32 Спасибо за ролик, интересный канал. Но по-моему, здесь что-то не то с тестом, или конкретная версия юнити криво реализовывала async C#. Надо перепроверять. К тому же даже в этом тесте оптимизированный async быстрее корутин.

    • @CiTRyS32
      @CiTRyS32 2 ปีที่แล้ว +1

      @@user-qb8lx2uq5j причем тут юнити и c#? Да, может в c# 9.0 оптимизировали асинхронщину, нужно актуализировать тест, но то, что "оптимизированный async быстрее корутин" никак не противоречит тому, что я вначале написал, ты путаешь горячее с теплым. В ролике на этом канале об оптимизации нет ни слова, а в тех тестах оптимизированная версия строится на том же UniTask
      P.S. Мне то пофиг, можешь пользоваться чем хочешь, но когда дело дойдет до публикации, например, на Itch.io и ты будешь билдить под веб, ни один твой дефолтный asynk/await не будет работать и тебе в любом случае придется изучать юнитаски или другие фреймворки на структурах

  • @bakiworld8025
    @bakiworld8025 ปีที่แล้ว +2

    Не хорошо воровать видео с других каналов)
    th-cam.com/video/WY-mk-ZGAq8/w-d-xo.html

  • @thebiggestdick69
    @thebiggestdick69 8 หลายเดือนก่อน

    Есть продолжение?

    • @thebiggestdick69
      @thebiggestdick69 8 หลายเดือนก่อน

      Я правильно понимаю что чтобы избежать выполнения асинхронных методов после завершения игры нужно каждый раз проверять работает ли еще приложение?