3

я занимаюсь разработкой приложения на Xamarin Forms и у меня возник следующий вопрос. Как создать бесконечно повторяющийся метод в c#, который работает на протяжении работы приложения? Предположим, я хочу создать метод, который должен через определенное количество времени выводить какую-то информацию на экран. Данный метод должен работать вне зависимости от действий пользователя.

Mikhail
  • 65
  • 10

2 Answers2

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
    Реализация оказалась очень простой, спасибо за ответ! – Mikhail Mar 17 '21 at 19:46
  • Изучаю и есть вопрос. Мне кто то писал тут, что не стоит создавать исключения лишний раз, так как это ресурсоёмкий процесс. А если я правильно понял, тут надо намеренно вызвать исключение чтобы выйти из цикла. Или для такого рода задач это норма ? – 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