我该怎么用Sleep或Timer

时间:2011-01-13 11:29:21

标签: c# timer sleep

我有两个使用计时器或使用sleep的替代方法,我需要在这个方法完成后每隔3秒调用一个方法,我写了一个基本的例子来证明我的意思:

public static void Main()
{
    new Thread(new ThreadStart(fooUsingSleep)).Start();

    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000);
}

public static void fooUsingSleep()
{
    Console.WriteLine("Doing some consuming time work using sleep");
    Thread.Sleep(3000);
    fooUsingSleep();
}

public static void fooUsingTimer(object dummy, ElapsedEventArgs dummyElapsed)
{
    Console.WriteLine("Doing some consuming time work usning timer");
    callToMethodAfterInterval(new Action<object, ElapsedEventArgs>(fooUsingTimer), 3000);
}

public static void callToMethodAfterInterval(Action<object,ElapsedEventArgs> inMethod, int inInterval)
{
    System.Timers.Timer myTimer = new System.Timers.Timer();
    myTimer.Elapsed += new ElapsedEventHandler(inMethod);
    myTimer.Interval = inInterval;
    myTimer.AutoReset = false;
    myTimer.Start();
}

所以我的问题是

1)我可以用更优雅的定时器编写代码吗?意味着从fooUsingTimer中删除对callToMethodAfterInterval方法的调用,使计时器为一行或两行,并从fooUsingTimer的声明中删除虚拟变量?

2)我理解睡眠不忙等待(http://www.codeproject.com/KB/threads/ThreadingDotNet.aspx) 所以我在这里找不到使用计时器选项的理由,因为睡眠更简单,使用什么更好,计时器版本还是睡眠版本?

3)我知道Timers.timer是线程安全的,它能帮助我实现我想要的行为吗?

感谢。

3 个答案:

答案 0 :(得分:3)

你是否意识到fooUsingSleep一遍又一遍地呼唤着自己?它最终会产生堆栈溢出。

如果您正在使用计时器,它可以像这样简单:

    System.Windows.Forms.Timer t = new System.Windows.Forms.Timer();
    t.Interval = 3000;
    t.Tick += new EventHandler((o,ea) => Console.WriteLine("foo"));

答案 1 :(得分:2)

您计划的真实背景也很重要。

睡眠选项'浪费'一个线程,在小型控制台应用程序中不是问题,但通常不是一个好主意。

您无需重启计时器,以下内容将继续滴答:

    static void Main(string[] args)
    {
        var t = new System.Timers.Timer(1000);
        t.Elapsed += (s, e) => CallMeBack();
        t.Start();

        Console.ReadLine();
    }

答案 2 :(得分:0)

睡眠可以解决问题,另一方面,Timer是为了这个目的而设计的,约定更好,它们通常会让你的代码更容易理解。