C# 保持System.Threading.Timer处于活动状态而不使用私有成员

C# 保持System.Threading.Timer处于活动状态而不使用私有成员,c#,timer,garbage-collection,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 voi

我目前正试图使用
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喜欢发牢骚,抱怨没有使用计时器:

现在,虽然我可以通过在计时器上方添加
//ReSharper disable once NotAccessedField.Local
来禁用此警告,但这是推荐的方法吗

我尝试了
GC.KeepAlive(timer)
而不是添加隐式引用,但这似乎没有任何作用。有没有一种方法可以告诉垃圾收集器在TestClass处于活动状态时保持计时器处于活动状态(而不使用ReSharper)

现在,虽然我可以通过在计时器上方添加“//ReSharper disable once NotAccessedField.Local”来禁用此警告,但这是推荐的方法吗

当需要对象保持活动状态时,可以显式存储对该对象的引用。
我看不出有什么问题。您可以随时使用注释来抑制ReSharper警告,也可以忽略它-这就是为什么它被称为警告,而不是错误

您需要了解的另一件重要事情是,当您使用完
计时器后,您不能忘记它,而期望GC停止并收集它。
System.Threading.Timer
是可识别的,需要正确处理

您也应该为您的对象实现
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())
{

}
现在,您可以确保您的
计时器在停止使用后立即正确停止和处置。
作为一个副作用,它解决了您的“未使用字段”警告:)

现在,虽然我可以通过在计时器上方添加“//ReSharper disable once NotAccessedField.Local”来禁用此警告,但这是推荐的方法吗

当需要对象保持活动状态时,可以显式存储对该对象的引用。
我看不出有什么问题。您可以随时使用注释来抑制ReSharper警告,也可以忽略它-这就是为什么它被称为警告,而不是错误

您需要了解的另一件重要事情是,当您使用完
计时器后,您不能忘记它,而期望GC停止并收集它。
System.Threading.Timer
是可识别的,需要正确处理

您也应该为您的对象实现
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())
{

}
现在,您可以确保您的
计时器在停止使用后立即正确停止和处置。

作为一个副作用,它解决了您的“字段未使用”警告:)

有很多方法。例如,您是否尝试过将引用存储在数组或列表中?然后将使用数组或列表(因为您在其中放入了一些内容)。但是,禁用该局部变量的警告有什么错呢?(注意:
GC.KeepAlive()
仅适用于使用它的方法。)您还可以使用其他计时器类之一,不需要保留引用。甚至,停止使用计时器对象,因为对于
Task.Delay()
async
/
wait
,大多数情况下都不需要它们。你的问题有太多可能的答案。似乎正确的解决方法有很多种。例如,您是否尝试过将引用存储在数组或列表中?然后将使用数组或列表(因为您在其中放入了一些内容)。但是,禁用该局部变量的警告有什么错呢?(注意:
GC.KeepAlive()
仅适用于使用它的方法。)您还可以使用其他计时器类之一,不需要保留引用。甚至,停止使用计时器对象,因为对于
Task.Delay()
async
/
wait
,大多数情况下都不需要它们。你的问题有太多可能的答案。这似乎是正确的解决方法