TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1206 1.47K
День девятьсот восемьдесят второй. #ЗаметкиНаПолях #AsyncTips
Передача информации о ходе выполнения операции

Задача:
отреагировать на прогресс выполнения операции.

Решение:
Используйте IProgress<T> и Progress<T>. Ваш асинхронный метод должен получать аргумент IProgress<T>; здесь T — тип прогресса, о котором вы хотите сообщать:
async Task MyMethodAsync(IProgress<double> progress = null)
{
bool done = false;
double completed = 0;
while (!done) {
...
progress?.Report(completed);
}
}

Пример использования в вызывающем коде:
async Task CallMyMethodAsync()
{
var progress = new Progress<double>(
p => progressBar.Value = p
);

await MyMethodAsync(progress);
}

По действующим соглашениям параметр IProgress<T> может быть равен null, если вызывающей стороне не нужны уведомления о прогрессе. Включите соответствующую проверку в асинхронный метод.

Лучше определить T как неизменяемый тип (или тип-значение). Если T является изменяемым ссылочным типом, то вам придётся самостоятельно создавать отдельную копию при каждом вызове IProgress<T>.Report.

Progress<T> сохраняет текущий контекст при создании и активизирует свой обратный вызов в этом контексте. Это означает, что если Progress<T> конструируется в UI-потоке (как в методе CallMyMethodAsync выше), то вы сможете обновить пользовательский интерфейс из его обратного вызова, даже если асинхронный метод вызывает Report из фонового потока.

Заметьте, что, если метод поддерживает уведомления о прогрессе, лучше, чтоб он также поддерживал отмену.

Источник: Стивен Клири “Конкурентность в C#”. 2-е межд. изд. — СПб.: Питер, 2020. Глава 2.
  • 👍 1
More from @netdeveloperdiary
  1. Oct 17, 2026День 2817. #ЧтоНовенького #VS Прекращаем Сборку После Первой Ошибки Мэдс Кристенсен продол…
  2. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  3. Oct 15, 2026Post #3374
  4. Oct 14, 2026Post #3373
  5. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  6. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
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 →