@trauus

Как избежать одновременного запуска асинхронного метода несколько раз и сохранить уведомления о прогрессе?

Есть метод Task UpdateDataAsync(IProgress progress, CancellationToken ct), который обновляет данные в приложении. Он может быть вызван либо по таймеру в фоне, либо пользователем явно. Выполняется он около минуты.
Возможна ситуация, когда метод был запущен в фоне и после этого пользователь тоже запустил обновление. В этом случает нужно:
1. Не создавать новый Task, а ожидать тот, что уже запущен
2. Уведомлять и пользователя и фоновую службу о прогрессе
3. Сохранить возможность отмены

С первым пунктом понятно, а по 2 и 3 упрощенно вижу так:
При вызове UpdateDataAsync progress и ct кладутся во внутренний список, затем в теле метода вызывается progress.Report для каждого сохраненного progress. То же самое и с CancellationToken.

Выглядит не очень, на мой взгляд. Судя по тому, что гуглинг результатов не дал, такие задачи решаются по-другому. Что скажете?
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
firedragon
@firedragon
Senior .NET developer
Если это в одном процессе, код тривиален
if(IsBusy){
return;
}
IsBusy = true;
await UpdateDataAsync ();
IsBusy = false;


Если это 2 и более процесса
1. создать файл
2. писать в него прогресс
3. уничтожить файл
4. при паралельном запуске ждать пока файл не удалят
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
OnederX Москва
от 100 000 до 120 000 ₽
от 3 000 до 4 000 $
BRIO MRS Казань
от 70 000 до 120 000 ₽
21 сент. 2020, в 13:21
50000 руб./за проект
21 сент. 2020, в 13:20
120000 руб./за проект
21 сент. 2020, в 13:08
5000 руб./за проект