Загрузка...

Return await не работает как должен.

Тема в разделе C# создана пользователем Yotic 21 окт 2021. 288 просмотров

  1. Yotic
    Yotic Автор темы 21 окт 2021 Ебашу на C# всё что захотите(Разноцветное) 43 13 янв 2021
    Есть у меня код -
    Код
    static async Task Main(string[] args)
    {
    await Start();
    }

    int maxBlock = 0;
    public static async Task Start()
    {
    for (; z < maxBlock; z++)
    {
    countBedrockInLineChank += await GetBedrockChunk(countBedrockInLineChank, z);
    }
    }

    public static async Task<long> GetBedrockChunk(long countBedrockInLineChank, int zCoord)
    {
    //вычисления на 6мин
    return countBedrockInChank;
    }
    По идеи своей он должен работать так, что await GetBedrockChunk(countBedrockInLineChank, z); каждый раз будешь ждать завершения рассчётов, но такового не происходит, что делать? Все говорят что троллер и всё должно работать
     
  2. undrcrxwn
    undrcrxwn 22 окт 2021 Заблокирован(а) 106 5 апр 2021
    шёл 2021 год, боги даровали людям отладчик, стектрейс и статический анализ, но тролли всё ещё создают топики с вопросами почему код работает не так как задумано
     
    1. Посмотреть предыдущие комментарии (4)
    2. undrcrxwn
      Yotic, да пох на 6 мин, до меня не доходит что нужно исправить, ща попробую воспроизвести твой случай
    3. undrcrxwn
      Yotic, запустил, всё работает
    4. undrcrxwn
      Yotic, или тебе нужно чтобы каждый прогон цикла чтобы был асинхронен?
  3. undrcrxwn
    undrcrxwn 22 окт 2021 Заблокирован(а) 106 5 апр 2021
    если ты хотел for сделать асинхронным, то вот:
    C#
    public static async Task CountBedrockBlocks()
    {
    IEnumerable<Task> tasks = Enumerable.Range(0, maxBlock).Select(z => DoSth(countBedrockInLineChank, z));
    await Task.WhenAll(tasks);
    }
    и советую вместо изменения состояния объектов (значений countBedrockInLineChank [читать BlocksInLineCount]) использовать возвращаемые значения. если метод считает количество блоков пусть он это количество вернёт, а не закинет в какую-то переменную класса, состояние менять должен метод, который вызвал этот "посчитать"-метод. в данном случае это позволило бы в CountBedrockBlocks прибавить к "countBedrockInLineChank" результаты всех тасок простым linq-выражением
    --- Сообщение объединено с предыдущим 22 окт 2021
    а ещё лучше чтоб сам CountBedrockBlocks возвращал количество блоков вместо void, на то он и "Count"
     
    22 окт 2021 Изменено
    1. Посмотреть предыдущие комментарии (4)
    2. undrcrxwn
      Yotic, чел всё работает, я скопировал твой вариант с синхронным выполнением и он работает, я переделал его в асинхронный (скинул его выше) и он тоже работает, в чем проблема то? все await срабатывают как должны
    3. Yotic Автор темы
      undrcrxwn, То есть, ты сделал +- нагрузку, мб Thread.Sleep(5000); и сделал 10 вызовов через фор, и программа за 50сек выполнится и всё это будет подрят?
    4. undrcrxwn
      Yotic, в первом случае да, во втором за 5 сек
  4. Yotic
    Yotic Автор темы 22 окт 2021 Ебашу на C# всё что захотите(Разноцветное) 43 13 янв 2021
    Ладно, полностью трахну асинхроность из всего кода
     
Загрузка...
Top