я занимаюсь разработкой приложения на Xamarin Forms и у меня возник следующий вопрос. Как создать бесконечно повторяющийся метод в c#, который работает на протяжении работы приложения? Предположим, я хочу создать метод, который должен через определенное количество времени выводить какую-то информацию на экран. Данный метод должен работать вне зависимости от действий пользователя.
Asked
Active
Viewed 1,137 times
3
-
2Timer? Thread? ___ – Andrew Stop_RU_war_in_UA Mar 17 '21 at 19:29
2 Answers
9
Например с помощью Асинхронного программирования.
private async Task RunLoopAsync(CancellationToken token)
{
try
{
while (true)
{
// ... что-то сделать
await Task.Delay(1000, token); // подождать одну секунду
}
}
catch (OperationCanceledException)
{ } // сработала отмена, ничего не делать
}
Использовать
private CancellationTokenSource _cts;
private async void StartLoop()
{
if (_cts != null)
return;
try
{
using (_cts = new CancellationTokenSource())
{
await RunLoopAsync(_cts.Token);
}
}
catch (Exception ex)
{
// ... ex.Message
}
_cts = null;
}
private void StopLoop()
{
_cts?.Cancel();
}
aepot
- 49,560
-
1
-
Изучаю и есть вопрос. Мне кто то писал тут, что не стоит создавать исключения лишний раз, так как это ресурсоёмкий процесс. А если я правильно понял, тут надо намеренно вызвать исключение чтобы выйти из цикла. Или для такого рода задач это норма ? – Xzizz May 10 '23 at 11:52
-
2@Vipz здесь это норма. А потом, сколько миллионов раз в секунду вам надо отканселлить токен? :) А так, исключения - это очень быстро работает. – aepot May 10 '23 at 13:25
0
Вариант с Таймером
private bool isRunning = true;
#if !DEBUG
Device.StartTimer(TimeSpan.FromMinutes(2), async() =>
{
await MyFunctuonFromDBForUpdateDataAsync();
return isRunning;
});
#endif
Dev18
- 640
-
где вы async void увидели ? -
async (_) =>этоasync voidлямбда, будьте внимательней. Это может затруднить отладку. – aepot Jan 26 '24 at 08:16