Как избежать одновременного запуска асинхронного метода несколько раз и сохранить уведомления о прогрессе?
Есть метод Task UpdateDataAsync(IProgress progress, CancellationToken ct), который обновляет данные в приложении. Он может быть вызван либо по таймеру в фоне, либо пользователем явно. Выполняется он около минуты.
Возможна ситуация, когда метод был запущен в фоне и после этого пользователь тоже запустил обновление. В этом случает нужно:
1. Не создавать новый Task, а ожидать тот, что уже запущен
2. Уведомлять и пользователя и фоновую службу о прогрессе
3. Сохранить возможность отмены
С первым пунктом понятно, а по 2 и 3 упрощенно вижу так:
При вызове UpdateDataAsyncprogress и ct кладутся во внутренний список, затем в теле метода вызывается progress.Report для каждого сохраненного progress. То же самое и с CancellationToken.
Выглядит не очень, на мой взгляд. Судя по тому, что гуглинг результатов не дал, такие задачи решаются по-другому. Что скажете?
Владимир Коротенко, Для обмена данным лучше использовать, опять же не файлы, а именованные каналы. Притом, что работа с ними выглядит так же как работа с файлом. Только нет нагрузки на диск и он может спокойно спать всю ночь.
Когда обновление запускается из фоновой службы, то прогресс отображается в строке статуса. Когда запускается пользователем явно - появляется всплывающее окно и прогресс отображается там.
Я хочу, чтобы в ситуации, когда обновление уже запущено из фоновой службы и пользователь явно еще раз его попытался запустить, ему будет отображаться прогресс того обновления, которое уже было запущено в фоне.
А в вашем варианте метод наткнется на IsBusy и вернется и со стороны пользователя все будет выглядеть так, будто кнопка обновления не работает.