gpt4 book ai didi

c# - System.Threading.Timer 保持对它的引用

转载 作者:行者123 更新时间:2023-11-30 21:21:15 24 4
gpt4 key购买 nike

根据 [ http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx][1]您需要保留对 System.Threading.Timer 的引用以防止它被处置。

我有这样的方法:

private void Delay(Action action, Int32 ms)
{
if (ms <= 0)
{
action();
}

System.Threading.Timer timer = new System.Threading.Timer(
(o) => action(),
null,
ms,
System.Threading.Timeout.Infinite);
}

我认为它没有保留对计时器的引用,到目前为止我还没有发现任何问题,但这可能是因为使用的延迟时间非常短。

上面的代码有错吗?如果是,我如何保留对计时器的引用?我在想这样的事情可能会奏效:

    class timerstate 
{
internal volatile System.Threading.Timer Timer;
};

private void Delay2(Action action, Int32 ms)
{
if (ms <= 0)
{
action();
}


timerstate state = new timerstate();
lock (state)
{
state.Timer = new System.Threading.Timer(
(o) =>
{
lock (o)
{
action();
((timerstate)o).Timer.Dispose();
}
},
state,
ms,
System.Threading.Timeout.Infinite);
}

锁定业务是为了让我可以在调用委托(delegate)之前将计时器放入 timerstate 类。在我看来,这一切都显得有些笨拙。也许我应该将计时器在完成构造并分配给 timerstace 实例中的属性之前触发的机会视为可以忽略不计并保留锁定。

最佳答案

您的第二种方法也不会保留引用。在 Delay2-block 结束后,对 state 的引用消失了,所以垃圾收集器将收集它......然后你对 Timer 的引用也消失了,它将被收集和处置。

class MyClass
{
private System.Threading.Timer timer;

private void Delay(Action action, Int32 ms)
{
if (ms <= 0)
{
action();
}

timer = new System.Threading.Timer(
(o) => action(),
null,
ms,
System.Threading.Timeout.Infinite);
}
}

关于c# - System.Threading.Timer 保持对它的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2866671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com