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
,大多数情况下都不需要它们。你的问题有太多可能的答案。这似乎是正确的解决方法