Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在自己的匿名Tick事件处理程序中停止Dispatchermer_C#_Wpf_Silverlight_Dispatchertimer - Fatal编程技术网

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

C# 在自己的匿名Tick事件处理程序中停止Dispatchermer,c#,wpf,silverlight,dispatchertimer,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 }; time

这样做安全吗:

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

对。您的计时器将触发一次。

编辑:我将根据评论重新表述我的答案。在您给出的情况下,使用匿名代理是完全安全的


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

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

然而,在这种特定的情况下,您的原始代码的工作方式没有任何问题,因为计时器一停止就可以被收集

这不是内存泄漏吗?如果没有相应的计时器。勾选-=,周围的对象不会因为计时器引用了此委托而被垃圾收集吗?@MattBridges:如果没有引用计时器,不管它有多大的“尾巴”,就我所知应该被收集。啊,对。不过,我仍然回避匿名委托作为事件处理程序。你应该更具体地说明“安全”是什么意思。@H.B。我将其保留为泛型,因为我不确定使用这样的匿名方法可能会出现什么问题。如果我知道,我会自己研究:)这不是一个坏习惯,除非你需要戒掉。在许多情况下,您不会这样做:计时器将被取消引用,计时器和非委托将被收集。避免这样一个非函数并不能神奇地使代码更安全—分离处理程序才是安全的。您仍然可以忘记对非anon代理执行此操作。在任何情况下,你都需要了解自己在做什么。最后,这是一个风格的问题——我倾向于远离它,因为我曾经被意外的内存泄漏咬过。“除非你需要脱身,否则这不是一个坏习惯”就像说“除非你拿到罚单,否则超速不是一个坏习惯。”哈,不如“不在家穿裤子是可以的,但出门时记得穿上裤子”;)但是,是的,我明白你的意思——这是一个偏好/风格的问题。马特的“风格问题”是一回事,但提供这样的建议,作为你回答的主要焦点,使用诸如“坏习惯”之类的词语,会使风格问题变得更加重要。就个人而言,我发现这种匿名函数的使用非常有益,它倾向于将特定任务都保存在一个地方,并且通常避免创建额外的类来保存事件/回调之间所需的任何状态。+1用于让我知道匿名委托何时不安全