TGViewer
codaza codaza @codaza · 4.59K subscribers
Post #40 2.95K
Ура! 🎉

Леонид был спасён уже через 5 минут после публикации поста в пятницу. Всё благодаря опытным подписчикам #codaza, которые не дали джуну утонуть в неведомых дебрях асинхронного кода C#. Лёне одобрили его первый merge в master, от чего он начал праздновать День Пельменей с невиданным размахом!

В чём же была проблема? Почему злой тим лид отмахивался комментарием “Просадка в производительности” и отклонял merge? Всё дело в 3-ей и 5-ой строках исходного кода. Что делает Леонид:

1. Запускает асинхронное выполнение задачи GroupDataChunkAsync().
2. Ожидает окончания её выполнения.
3. Запускает асинхронное выполнение задачи CalculateCypherPhraseAsync().
4. Ожидает окончания её выполнения.

Все эти 4 действия выполняются последовательно. Но Лёня не задаётся вопросом, а нужно ли выполнять эти действия последовательно? Может быть, они могут быть выполнены параллельно? И, как вы уже догадались, эти действия могут быть выполнены параллельно. Мы можем вызвать асинхронное выполнение методов GroupDataChunkAsync() и CalculateCypherPhraseAsync() независимо, так как результат их выполнения потребуется только на 7-ой строке. То есть, следовало сделать так:

1. Запустить асинхронное выполнение задачи GroupDataChunkAsync().
2. Запустить асинхронное выполнение задачи CalculateCypherPhraseAsync().
3. Дождаться результата выполнения обеих задач и продолжить логику метода ProcessItemsAsync().

Один из вариантов, который предложил подписчик Eugene Potashkin, это воспользоваться статическим методом WhenAll, который реализован в классе Task. То есть, код будет выглядеть так:

var groupTask = GroupDataChunksAsync(limit);
var phraseTask = CalculateCypherPhraseAsync(limit);
await Task.WhenAll(groupTask, phraseTask);
bool check = CheckEncryption(groupTask.Result, phraseTask.Result, limit);

Но более лаконичный вариант для данной конкретной реализации, предложил подписчик Руслан Петряев, где мы ожидаем результата выполнения задач непосредственно в вызове метода CheckEncryption(). Именно такую реализацию вы можете видеть на картинке выше. Так или иначе, оба варианты равнозначны и являются верными.

Всем хорошего вечера! ☕️
  • 👍 43
More from @codaza
  1. Oct 28, 2022#капитану_на_заметку Всем привет! 👻 Понятие "качественный код" очень многогранно. Одна из…
  2. Oct 5, 2022#капитану_на_заметку Всем привет! Рефакторить код и визуально уменьшать синтаксические кон…
  3. Sep 14, 2022#капитану_на_заметку Всем привет! Мне нравится использовать подход Code First. Особенно уд…
  4. Sep 7, 2022#капитану_на_заметку Всем привет! Нельзя сказать, что генерация исключений в C# выглядит и…
  5. Aug 31, 2022#капитану_на_заметку Всем привет! Комментирование исходного кода — это здорово! Открыл исх…
  6. Aug 24, 2022#капитану_на_заметку Всем привет! Большинство web-сервисов предоставляют возможности для и…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →