#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;