如您所知,Thread類具有IsAlive屬性。如果線程方法返回或線程被中止,則爲false。所以我有這個問題:在線程中使用Timer - IsAlive屬性爲false
我有一個Windows服務,在不同的線程中啓動幾個任務。它永久性地檢查線程的IsAlive屬性,如果它是假的 - 重新創建一個任務:
foreach (var worker in _workers)
_threads.Add(new Thread(worker.ProtectedRun));
foreach (var thread in _threads)
thread.Start();
while (!EventWaitHandle.WaitOne(0))
{
for (var i = 0; i < _threads.Count; i++)
{
if (!_threads[i].IsAlive)
{
_threads[i] = new Thread(_workers[i].ProtectedRun);
_threads[i].Start();
}
}
EventWaitHandle.WaitOne(1000);
}
但一個任務具有定時器內。在ProtectedRun方法中,它啓動計時器並返回。返回方法之後 - > Thread的IsAlive屬性變爲假 - > Windows服務再次啓動線程 - >無限循環:)
public override void ProtectedRun()
{
_timer = new System.Timers.Timer(24 * 60 * 1000);
_timer.Elapsed += OnTimedEvent;
_timer.Enabled = true;
_timer.Start();
}
難道有人有一個想法如何處理這種情況?也許檢查線程狀態而不是IsAlive屬性?
如果您不檢查線程狀態/ IsAlive,請不要讓線程終止並且不要重新創建它們,在這些區域中不會有任何問題。把線程代碼寫成循環 - 你永遠不需要爲線程狀態而掙扎,並且再次創建/終止。儘量專注於'真正的應用程序代碼',而不是線程微管理,並且你的生活將變得如此簡單:-)你真的需要一個計時器嗎?睡眠(間隔)是一個更簡單的方法,並且不涉及運行定時器的另一個池線程的信號/執行。 – 2012-07-06 11:45:42