保持System.Threading.Timer不使用私有成员

时间:2017-07-19 05:54:18

标签: c# timer garbage-collection

我目前正在尝试使用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婊子)?

1 个答案:

答案 0 :(得分:4)

  

现在,虽然我可以通过在_timer上方添加“// ReSharper禁用一次NotAccessedField.Local”来禁用此警告,这是推荐的方法吗?

当你需要它来保持活着时,可以明确地存储对象的引用 我觉得它没有错。您始终可以使用注释来抑制ReSharper警告,或者只是忽略它 - 这就是为什么它被称为警告而不是错误。

您需要了解的另一件重要事情是,您在使用完毕后不能忘记Timer并希望GC停止并收集它。
System.Threading.TimerIDisposable,需要正确处理。

你也应该为你的对象实现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]。 作为副作用,它解决了您的“字段未使用”警告:)