プログラムを短く簡潔に記述するのに、ラムダ式は便利ですが、イベントハンドラを記述する場合には、少しコツがいります。下記のように記述した場合には、ラムダ式内で、handlerが参照できずエラーとなります。
Test1.cs
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
EventHandler handler = (ss, ee) =>
{
timer.Tick -= handler;
timer.Stop();
timer = null;
};
timer.Tick += handler;
timer.Start();
ラムダ式内で、handlerを参照できるように、前もってhandlerを定義してから使います。
せっかくラムダ式を使っているのに、行数が増えてしまって残念ですが、イベントハンドラの解除も一箇所に纏まって見通しの良いコードになります。
Test2.cs
DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(1000);
EventHandler handler = null;
handler = (ss, ee) =>
{
timer.Tick -= handler;
timer.Stop();
timer = null;
};
timer.Tick += handler;
timer.Start();