优秀的编程知识分享平台

网站首页 > 技术文章 正文

C#.NET 5种方式实现程序暂停几秒(c#停止运行代码)

nanyue 2024-10-25 13:20:07 技术文章 2 ℃

我相信大家都有经历过这样的需求,需要让程序暂停几秒后执行,我相信大家最先想到的肯定是Thread.Sleep(),那我们除了Thread.Sleep()之外,C# 还有其他方式让程序暂停吗?在本文中,我将介绍5种暂定的方式,包括异步方法、睡眠命令、睡眠函数和信号量,自定义共5种实现方式。最后我给出实例演示结果供大家测试。也欢迎大家给出其他实现方式,一起学习。

Thread.Sleep

Thread.Sleep 命令是一个简单但功能强大的工具,可让您将代码的执行暂停特定的时间。这就像告诉你的程序在继续下一个任务之前小睡一会儿。在C#中,可以使用Thread.Sleep(int milliseconds)方法来实现这一点。

        /// <summary>
        /// 方式1,Thread.Sleep
        /// </summary>
        static void ThreadSleep()
        {
            Console.WriteLine(#34;[{DateTime.Now}] ThreadSleep 方式");
            Thread.Sleep(3000); // Sleep for 3 seconds
            Console.WriteLine(#34;[{DateTime.Now}] ThreadSleep 方式 after 3 seconds");
        }

需要注意的是,Thread.Sleep 是一种阻塞线程的方式,如果在 UI 线程或 ASP.NET 应用程序中使用它,会导致应用程序无响应或请求超时。因此,应该避免在 UI 线程或 ASP.NET 应用程序中使用 Thread.Sleep。

Task.Delay

C# 中的异步方法使您能够在不阻塞主线程的情况下并发执行多个任务。这意味着当一个任务正在等待时,其他任务可以继续运行。要实现一个async方法,您需要使用async关键字和Task类。

      /// <summary>
        /// 方式2,异步方法和任务
        /// </summary>
        static async Task DoSomethingAsync()
        {
            Console.WriteLine(#34;[{DateTime.Now}] DoSomethingAsync 方式");
            await Task.Delay(3000);  // Sleep for 3 seconds
            Console.WriteLine(#34;[{DateTime.Now}] DoSomethingAsync 方式 after 3 seconds");
        }

Task.Delay 是一种非阻塞线程的方式,它会释放当前线程,以便它可以执行其他操作。因此,它适用于 UI 线程或 ASP.NET 应用程序中。

计时器Timer

Timer 是一种计时器,它可以定期触发事件。可以使用 Timer 来实现等待几秒的操作。例如,创建一个 Timer,设置它的间隔为几秒钟,然后在事件处理程序中执行需要等待的操作。

        /// <summary>
        /// 方式3,定时器方式
        /// </summary>
        static void TimersTimer()
        {
            Console.WriteLine(#34;[{DateTime.Now}] TimersTimer 方式 ");
            timer = new System.Threading.Timer(Callback, state: null, dueTime: TimeSpan.FromSeconds(3), period: TimeSpan.FromSeconds(3));
        }

        private static void Callback(object state)
        {
            Console.WriteLine(#34;[{DateTime.Now}] TimersTimer Callback  after 3 seconds");
            timer.Change(dueTime: Timeout.Infinite, period: Timeout.Infinite);
        }

Timer 是一种异步的方式,它会在后台线程中触发事件。因此,在事件处理程序中执行的代码可能会与主线程或 UI 线程不同步。如果需要更新 UI 或执行其他线程操作,应该使用 Invoke 或 BeginInvoke 方法。

自定义等待函数

有时,您可能需要自定义等待函数来满足代码中的特定要求。例如,您可能希望创建一个只阻塞当前任务而不是整个线程的等待函数。您可以使用async委托来实现这一点。

       /// <summary>
        /// 方式4,自定义函数
        /// </summary>
        static async Task CustomWaitAsync()
        {
            
            Console.WriteLine(#34;[{DateTime.Now}] CustomWaitAsync 方式");
            await CustomWaitAsync(3000);  // Sleep for 3 seconds
            Console.WriteLine(#34;[{DateTime.Now}] CustomWaitAsync 方式 after 3 seconds");
        }

        /// <summary>
        /// 该方法使用async委托在新任务中运行Thread.Sleep函数,确保当前任务在等待时被阻塞,而不是主线程
        /// </summary>
        /// <param name="milliseconds"></param>
        /// <returns></returns>
        private static async Task CustomWaitAsync(int milliseconds)
        {
            await Task.Run(() => Thread.Sleep(milliseconds));
        }

使用async委托在新任务中运行Thread.Sleep函数,确保当前任务在等待时被阻塞,而不是主线程。

使用ManualResetEvent 信号量

可以使用 Thread、ManualResetEvent 或 SemaphoreSlim 等原语来实现等待几秒的操作,创建了一个 ManualResetEvent 对象,并在后台线程中等待它。如果在3秒钟内 ManualResetEvent 被设置,后台线程就会执行需要等待的操作。否则,后台线程就会退出。

/// <summary>
        /// 方式5,利用Thread、ManualResetEvent 
        /// </summary>
        static void ManualReset()
        {
            Console.WriteLine(#34;[{DateTime.Now}] ManualReset 方式");
            var resetEvent = new ManualResetEvent(false);
            var thread = new Thread(() =>
            {
                resetEvent.WaitOne(3000);
                Console.WriteLine(#34;[{DateTime.Now}] ManualReset 方式 after 3 seconds");
            });

            thread.Start();
        }

最后给出本文测试结果:

      /// <summary>
        /// 测试入口
        /// </summary>
        public static async Task Test()
        {
            Console.WriteLine(#34;[{DateTime.Now}] C# 等待几秒钟三种方式测试.");

            //方式1,Thread.Sleep
            ThreadSleep();

            //方式2,异步方法和任务
            await DoSomethingAsync();

            //方式3,异步方法和任务
            TimersTimer();

            await Task.Delay(5000);

            //方式4,自定义函数
            await CustomWaitAsync();

            //方式5,利用Thread、ManualResetEvent 
            ManualReset();

           
        }

在 .NET 中,可以使用多种方式实现等待几秒的操作,现在我们已经介绍完5种暂停方式,当然每种方式使用场景还是需要根据需求进行合理运用,了解何时使用每种技术至关重要。这里我总结下个人经验:

  • Thread.Sleep当您需要一种简单的方法来将代码的执行暂停指定的时间时,请使用该函数。
  • async 当需要同时执行多个任务而不阻塞主线程时,请使用方法和任务。
  • 当您需要以指定的时间间隔执行特定任务时,请使用计时器。
  • 当您有内置方法无法满足的特定要求时,创建自定义等待函数。

最后,如果您还知道还有其他方式实现让程序等待几秒,麻烦您一定告诉我。谢谢!

Tags:

最近发表
标签列表