2016-04-28 28 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收集。