Как вызвать функцию из таймера

#c#

Вопрос:

Я хочу вызвать функцию через интервал в uwp, поэтому у меня есть это:

  private void TimedEvent()
        {
           aTimer = new System.Timers.Timer();
            aTimer.Interval = 40000;
           aTimer.Elapsed  = new ElapsedEventHandler(PresencePage_Loaded);
            aTimer.AutoReset = true;

        }

 private async void PresencePage_Loaded(object sender, RoutedEventArgs e)
        {}
 

Однако я получаю сообщение об отсутствии перегрузки для ошибки делегата ElapsedeventHandler для совпадений presencePage_loaded.
Где я ошибаюсь?

Ответ №1:

Подпись ElapsedEventHandler делегата является:

 public delegate void ElapsedEventHandler(object sender, ElapsedEventArgs e);
 

Вам нужно изменить подпись метода, чтобы она соответствовала, поэтому вам нужно перейти RoutedEventArgs на ElapsedEventArgs :

 private async void PresencePage_Loaded(object sender, ElapsedEventArgs e)
{
}
 

Комментарии:

1. может вызвать больше проблем, чем это исправляет, поскольку по умолчанию для загруженного события используется значение PresencePage_Loaded, поэтому изменение его подписи приведет к нарушению события страниц

Ответ №2:

Истекшее время объявляется как

 public event System.Timers.ElapsedEventHandler Elapsed;
 

где, как загружено, находится

 public event System.Windows.RoutedEventHandler Loaded;
 

поскольку события имеют разные типы, вы не можете использовать обработчик для одного в качестве обработчика для другого

самым простым вариантом было бы извлечь вашу логику из обработчика в функцию

 public async Task DoSomething(){...}
 

тогда у вас может быть 2 обработчика, которые вызывают эту функцию, т. е.

 private async void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    await DoSomething();
}

private async void PresencePage_Loaded(object sender, RoutedEventArgs e)
{
    await DoSomething();
}
 

которые будут прилагаться следующим образом

 aTimer.Elapsed  = Timer_Elapsed;