@trauus

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

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

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

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


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

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

Похожие вопросы