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

本文关键字:DispatcherTimer 程序 事件处理 Tick 自己的 | 更新日期: 2023-09-27 18:12:06

这样做安全吗?

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();
}

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

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();
}

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

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

编辑:我将根据评论重新措辞我的答案。在你给出的情况下,是的,使用匿名委托是绝对安全的。

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