Рутина инди-разработчика: Thread.Sleep vs Task.Delay

Поділитися
Вставка
  • Опубліковано 19 лис 2024

КОМЕНТАРІ • 10

  • @ЗояХаритонова-у9р
    @ЗояХаритонова-у9р 10 місяців тому

    С Новым годом !!!Успехов во всех делах,всего,чего сами себе желаете,обнимаем,все мы.❤❤❤❤❤❤❤❤❤❤

    • @zapominai
      @zapominai  10 місяців тому

      С новым годом!

  • @apapap917
    @apapap917 9 місяців тому

    Кажется имелось ввиду что надо писать await Task.Delay() а не Task.Delay().Wait()
    Wait() - то тоже синхронный вызов и блокирует вызывающий поток, только при этом еще и таска создается когда Task.Delay вызывается.
    тут единственным выходом кажется является переделка всего кода на асинхронные методы чтобы это имело смысл (ну и тут серьезно накосячить можно и все сломать при такой масштабной переделке). Если не прав, поправь, интересно)
    ну а вообще пет проекты они такие - постоянно какие-то новые баги прилетают)

    • @zapominai
      @zapominai  9 місяців тому

      Да, ты прав, Task.Delay().Wait() - блокирует основной поток. Это лучше чем Thread.Sleep по нагрузке на процессор. Придётся таки переделать всё на async функции.

    • @zapominai
      @zapominai  9 місяців тому

      Сейчас сел проверять, никаких блокировок родительского потока не увидел. Хоть пишут, что они должны быть. В следующем ролике подробно расскажу.

    • @zapominai
      @zapominai  9 місяців тому

      Всё ещё сложнее....)

    • @apapap917
      @apapap917 9 місяців тому

      ​@@zapominai возможно там так: If the current task has not started execution, the Wait method attempts to remove the task from the scheduler and execute it inline on the current thread. If it is unable to do that, or if the current task has already started execution, it blocks the calling thread until the task completes.
      Он запускает таску сразу в текущем потоке, а там асинхронный вызов к операционной системе, из-за этого поток отдается обратно в тред пул.
      Если там была бы уже запущенная таска, возможно была бы блокировка потока.
      Пока у меня такая версия происходящего
      Кстати вместо Wait() при переходе из асинхронных в синхронные методы обычно используется GetAwaiter().GetResult(), в последнем варианте эксепшены прокидываются без обертки в AggregateException что удобнее в отлове

    • @apapap917
      @apapap917 9 місяців тому

      @@zapominai кстати вместо Wait() обычно используется GetAwaiter().GetResult(), так эксепшены из таски прокидываются без обертки в AggregateException что удобнее в отлове