我目前正在尝试使用System.Threading.Timer
为我当前的课程启动回调。我目前的课程如下:
public class TestClass
{
private Timer _timer;
public TestClass()
{
_timer = new Timer(Callback, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
}
private void Callback(object state)
{
//Do stuff here
}
}
这会将Timer
附加到TestClass,并防止垃圾回收。我注意到的是,resharper喜欢婊子和呻吟没有使用_timer:
现在,虽然我可以通过在_timer上方添加// ReSharper disable once NotAccessedField.Local
来禁用此警告,但这是推荐的方法吗?
我尝试GC.KeepAlive(timer)
而不是添加隐式引用,但似乎没有做任何事情。有没有办法告诉垃圾收集器只要TestClass还活着就保持计时器活着(没有ReSharper婊子)?
答案 0 :(得分:4)
现在,虽然我可以通过在_timer上方添加“// ReSharper禁用一次NotAccessedField.Local”来禁用此警告,这是推荐的方法吗?
当你需要它来保持活着时,可以明确地存储对象的引用 我觉得它没有错。您始终可以使用注释来抑制ReSharper警告,或者只是忽略它 - 这就是为什么它被称为警告而不是错误。
您需要了解的另一件重要事情是,您在使用完毕后不能忘记Timer
并希望GC停止并收集它。
System.Threading.Timer
为IDisposable
,需要正确处理。
你也应该为你的对象实现IDisposable
模式:
public class TestClass : IDisposable
{
private Timer _timer;
public TestClass()
{
_timer = new Timer(Callback, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
}
private void Callback(object state)
{
//Do stuff here
}
public void Dispose() // the simplest IDisposable implementation
{
_timer?.Dispose();
}
}
// Usage:
using (var testClass = new TestClass())
{
}
现在,您可以确定在Timer
停止使用后正确停止并处理了prices$Date[-1]
。
作为副作用,它解决了您的“字段未使用”警告:)