Если вы хотите снова отменить регистрацию обработчика событий Elapsed, вам не следует использовать делегат, не запоминая его в переменной.
Таким образом, другим решением может быть создание пользовательского класса на основе Timer. Просто добавьте любые элементы, которые вам нравятся, и получите свой собственный объект Timer обратно из аргумента «отправитель» обработчика события «Истек»:
class CustomTimer : System.Timers.Timer
{
public string Data;
}
private void StartTimer()
{
var timer = new CustomTimer
{
Interval = 3000,
Data = "Foo Bar"
};
timer.Elapsed += timer_Elapsed;
timer.Start();
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
string data = ((CustomTimer)sender).Data;
}
Эта стратегия, конечно, работает и для других событий и классов, если базовый класс не запечатан.