Создание бесконечно повторяющегося метода в c#

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


Ответы (2 шт):

Автор решения: aepot

Например с помощью Асинхронного программирования.

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();
}
→ Ссылка
Автор решения: Dev18

Оставлю здесь этот ответ, в моем случае работает без перебоя, может будут мнения и объяснения...

private System.Threading.Timer? timer; 
timer = new System.Threading.Timer((_) =>
{
    InvokeAsync(async () =>
    {
        //когда я пишу ConfigureAwait(false) IIS бросает исключение 
        //когда не пишу совсем тоже бросает исключение
        await MyFunctionAsync().ConfigureAwait(true); 

        StateHasChanged();
    });
}, null, 120000, 120000); //каждые две минуты обновляет страницу. 

у меня приложение на Блазор сервер и устанавливаю на IIS, отрезок кода с таймером пишу в OnInitialize методе на разор странице, но думаю, что в XamarinForms можно будет использовать

вот это решение работает на wasm в моем случае, но серверБлазор бросает исключение при публикации на IIS. Говорит при исключении про Pool...

private System.Threading.Timer? timer;

protected override async Task OnInitializedAsync()
{
    timer = new System.Threading.Timer(async (object? stateInfo) =>
    {
        await MyFunctionAsync();
        StateHasChanged(); // ПРИМЕЧАНИЕ: надо вызвать StateHasChanged(),
    }, new System.Threading.AutoResetEvent(false), 2000, 2000); // каждые 2 мл сек
}
→ Ссылка