创建一个异步任务,每隔一秒打印当前时间,大家分析下这两种实现的异同吧,也可以说说自己的实现方案

ShawnTaoo
  • 26

需求为 : 创建一个异步的任务,每隔一秒打印一下当前的时间。
以下有两种实现方案,大家帮忙看下这两种方案各自有什么优缺点。
或者给一下你自己的实现方案吧。

实现1

        static void Main(string[] args)
        {
            createJob1();

            Console.ReadLine();
        }

        /// <summary>
        /// createjob 本身需要是异步的,调用后立即返回
        /// </summary>
        static void crateJob1()
        {
            new Task(()=>{
                while (true)
                {
                    Thread.Sleep(1000 * 1);
                    Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));
                }
            }).Start();
        }

实现2


static void Main(string[] args) { createJob2(); Console.ReadLine(); } /// <summary> /// createjob 本身需要是异步的,调用后立即返回 /// </summary> static Task createJob2() { return Task.Delay(1000 * 1).ContinueWith(t => { Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); createJob2(); }); }
回复
阅读 3.8k
5 个回答

第一种方式需要占用一个线程,第二种不用。根据实际情况吧。

根据你的需求来看,用方案1就足够了。
首先方案1比较简单,其实就是用一个额外的线程在死循环中隔一秒打印一次时间,容易理解,而且没什么坑的地方。
而对于方案2,我相信你自己对于.NET 4.5中Task新推出的Api(Delay方法和ContinueWith方法)如何正确使用还应该不熟悉(说实在话,我也不熟悉),使用不熟悉的东西往往是最容易出问题的地方,我将这句代码

Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"));

替换为

Debug.WriteLine(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss") + Thread.CurrentThread.ManagedThreadId.ToString());

发现方案2使用的线程数要比方案1多,所以推断这样写的效率是低于方案1的。

1.肯定是第二种好。

2.不建议在主线程的一个方法里包含一个完整的新线程逻辑,耦合太强,也不利于调试。新线程的逻辑最好单独写在一个方法里。

宣传栏