在自己的匿名Tick事件处理程序中停止DispatcherTimer

时间:2011-10-21 23:11:06

标签: c# wpf silverlight dispatchertimer

做这样的事情是否安全:

private void MyFunction()
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    timer.Tick += (object sender, object e) =>
    {
        timer.Stop();
        // Some code here
    };
    timer.Start();
}

3 个答案:

答案 0 :(得分:5)

Matt提出了一种观点,即你附加匿名方法的方式是没有简单的方法来分离它。这是一个通用模式,您可以使用它来在必要时分离。

private void MyFunction()
{
    DispatcherTimer timer = new DispatcherTimer();
    timer.Interval = new TimeSpan(0, 0, 1);
    EventHandler eh = null;
    eh = (object sender, object e) =>
    {
        timer.Tick -= eh;
        timer.Stop();
        // Some code here
    };

    timer.Tick += eh;
    timer.Start();
}

然而,在这种特定情况下,原始代码的工作方式没有任何问题,因为定时器一旦停止就会变为可收集状态。

答案 1 :(得分:4)

是。你的计时器会触发一次。

答案 2 :(得分:2)

编辑:我会根据评论重新解释我的回答。在您已经给出的情况下,是的,使用匿名代表是完全安全的。

一些情况,其中添加匿名委托而不分离它可能会阻止您的类被垃圾收集(例如,将匿名委托附加到单例)。有关何时分离事件处理程序的信息,请参阅this answer