2016-04-28 47 views
1

我寫了一個簡單的輔助類執行延遲的任務:System.Threading.Timer並不總是叫

public class TaskExecutor { 
    private static void Callback(object state) { 
     ((Action)state)(); //Not always be called 
    } 
    public static void DelayExecute(int mSec, Action task) { 
     if (task != null) { 
      new Timer(Callback, task, mSec, Timeout.Infinite); 
     } 
    } 
} 

我用這樣的:

TaskExecutor.DelayExecute(10000,() => { Console.WriteLine("Haha..."); }); 

然而,定時器似乎並不每次工作。這意味着有時它很好,有時甚至不好。爲什麼?我該怎麼做纔對?

+4

你不能只使用'Task.Delay(10000).ContinueWith(...);'而不是寫新代碼和使用定時器等嗎? –

+2

此外,您的具體問題在[文檔](https://msdn.microsoft.com/en-us/library/system.threading.timer(v = vs.110).aspx)中解決:「只要你正在使用一個定時器,你必須保留對它的引用,就像任何被管理的對象一樣,當一個定時器沒有引用時,定時器就會被垃圾收集,事實上定時器仍然有效並不妨礙它被收集「。 –

+2

@Damien_The_Unbeliever,是的,我認爲這是問題所在。我沒有提及定時器。 – guogangj

回答

1

您必須在某處提供對您創建的Timer對象的引用。否則它將由GC收集。