2017-07-19 19 views
0

我目前正在嘗試使用System.Threading.Timer來爲我當前的類啓用回調。我現在的階級是這樣的:在不使用私有成員的情況下保持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

有很多方法。例如,您是否嘗試將參考存儲在數組或列表中?然後數組或列表將被使用(因爲你把東西放在裏面)。但是,僅僅禁用該局部變量的警告有什麼不對? (注意:'GC.KeepAlive()'僅適用於使用它的方法。)您也可以使用其他計時器類之一,這不需要您保留引用。甚至,停止使用定時器對象,因爲使用'Task.Delay()'和'async' /'await',大多數情況下你不需要它們。從字面上看,你的問題有許多可能的答案。 –

+0

似乎是使用它的正確方法https://blog.stephencleary.com/2011/07/systemthreadingtimer-constructor-and.html –

回答

3

現在,雖然我可以通過在_timer上面添加「// ReSharper disable Once NotAccessedField.Local」來禁用此警告,但這是推薦的方法嗎?

當您需要它保持活動狀態時,可以顯式存儲對象的引用。
我看到沒有錯。您始終可以使用註釋來壓制ReSharper警告,或者忽略它 - 這就是爲什麼它被稱爲警告,而不是錯誤。

您需要了解的另一件重要的事情是,當您完成使用並期望GC停止並收集它時,您不能忘記Timer
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正確停止和處置權,你停止使用後。 作爲一個副作用,它解決了你的「字段未使用」警告:)

相關問題