What should I use Sleep or Timer

北城以北 提交于 2019-12-01 17:24:37

问题


I have two alternative using timer or using sleep, I need to call a method every 3 seconds after this method is finished, I wrote basic example to demonstrate what I mean:

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();
}

So my questions are

1)Can I wrote the code with the timer more elegant? Means removing the call to the callToMethodAfterInterval method from fooUsingTimer, make the timer one or two lines, and remove the dummy variables from the declaration of fooUsingTimer?

2)I understand sleep isn't busy waiting (http://www.codeproject.com/KB/threads/ThreadingDotNet.aspx) So I don't found justification to use the timer option here, because the sleep is more simple, what is better to use, the timer version or the sleep one?

3)I know that Timers.timer is thread safe, does it can help me in the behavior I want to implement?

Thanks.


回答1:


The real context of your program matters too.

The sleep option 'wastes' a Thread, not a problem in a small console app but in general not a good idea.

You don't need to restart the timer, the following will keep ticking:

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

        Console.ReadLine();
    }



回答2:


Do you realize that fooUsingSleep is calling itself over and over? It will eventually generate a stack overflow.

If you are using timer, it can be as simple as this:

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



回答3:


Sleep will do the trick, Timer on the other hand has been designed for that exact purpose, conventions are better and they will usually make your code more understandable.



来源:https://stackoverflow.com/questions/4679539/what-should-i-use-sleep-or-timer

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!