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用于让我知道匿名委托何时不安全