2014-04-04 107 views
0

我有一個方法使用System.Timers.Timer這些代碼調用由ThreadSystem.Timers.Timer在終止其工作線程時終止嗎?

private void timeWorker() 
{ 
    var timer = new Timer(1000); 
    timer.Enabled = true; 
    timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); 
} 
public MyConstructor() 
{ 
    var thread=new Thread(timeWorker); 
    thread.IsBackground = true; 
    thread.Start(); 
    // 
    thread.Abort(); 
} 

是否System.Timers.Timer終止對中止其工作主題?

+1

1)計時器並不真正「屬於」創建它們的線程。這兩者之間沒有任何關係。 2)無論你在做什麼,'Thread.Abort'幾乎肯定是*不是正確的答案。但是你還沒有告訴我們你在這裏試圖解決什麼問題。 –

+0

@Damien_The_Unbeliever我的問題是,我想確保通過中止線程,定時器將不再被啓用。 –

+0

但是放棄一個線程,本身幾乎總是**錯誤**。爲什麼你認爲解決你的問題的最佳方法是中止一個線程? –

回答

0
  1. 您不能通過中止線程來終止定時器。
  2. Timer有它自己的線程來調用你的事件處理程序。
  3. 此外,由於@Damien_The_Unbeliever表示定時器不屬於任何線程,它是系統對象。
  4. GC將不會收集計時器,因爲您的事件處理程序。

你應該在你的線程方法實現中使用try-catch來捕獲ThreadAbortException並停止計時器。

0

MSDN C# Threading

我建議這個鏈接一般營運與線程。還提到Abort將中斷線程,並防止使用的資源被清理。

一個更好的選擇是調用禁用timeWorker類中的while循環一樣

public void RequestStop() 
{ 
    running = false; 
} 

,而工人正在做環

public void DoWork() 
{ 
    while(running) 
    { 
     ... 
    } 
//execution stopped 
} 

他的作品有一種方法變量private volatile bool running