Создание бесконечно повторяющегося метода в c#
я занимаюсь разработкой приложения на Xamarin Forms и у меня возник следующий вопрос. Как создать бесконечно повторяющийся метод в c#, который работает на протяжении работы приложения? Предположим, я хочу создать метод, который должен через определенное количество времени выводить какую-то информацию на экран. Данный метод должен работать вне зависимости от действий пользователя.
Ответы (2 шт):
Например с помощью Асинхронного программирования.
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();
}
Оставлю здесь этот ответ, в моем случае работает без перебоя, может будут мнения и объяснения...
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 мл сек
}