C#快速写延迟函数

本文介绍了一个使用线程池进行任务调度的例子,通过 QueueUserWorkItem 方法异步执行了一个简单的延迟操作,并在延迟结束后清空了标签控件中的文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadPool.QueueUserWorkItem(delegate
            {
                Thread.Sleep(3000);
                BeginInvoke((Action)delegate
                {
                    label.Text = "";
                });
            });

### C# 延时函数的实现方式 在 C# 中,延时功能可以通过多种方法实现。以下是几种常见的实现方式: #### 方法一:使用 `Thread.Sleep` `Thread.Sleep` 是一种简单直接的方法来实现延时。它会让当前线程暂停指定的时间(以毫秒为单位)。然而,这种方法会导致线程阻塞,不能响应其他事件[^2]。 ```csharp using System; using System.Threading; public class Program { public static void Main() { Console.WriteLine("开始延时..."); Thread.Sleep(2000); // 延时 2 秒 Console.WriteLine("延时结束!"); } } ``` #### 方法二:使用 `Application.DoEvents` 当需要在延时期间保持 UI 的响应性时,可以结合 `Application.DoEvents` 使用循环来实现延时。这种方式不会阻塞主线程,并允许处理其他事件[^1]。 ```csharp using System; using System.Windows.Forms; public class Program { public static void Delay(int delayTime) { DateTime now = DateTime.Now; int s; do { TimeSpan span = DateTime.Now - now; s = span.Seconds; Application.DoEvents(); } while (s < delayTime); } public static void Main() { Console.WriteLine("开始延时..."); Delay(2); // 延时 2 秒 Console.WriteLine("延时结束!"); } } ``` #### 方法三:使用 `Environment.TickCount` 通过比较 `Environment.TickCount` 的值,可以实现一个非阻塞的延时函数。此方法同样需要调用 `Application.DoEvents` 来确保 UI 响应性[^4]。 ```csharp using System; public class Program { public static void Delay(int milliSecond) { int start = Environment.TickCount; while (Math.Abs(Environment.TickCount - start) < milliSecond) { System.Windows.Forms.Application.DoEvents(); } } public static void Main() { Console.WriteLine("开始延时..."); Delay(2000); // 延时 2 秒 Console.WriteLine("延时结束!"); } } ``` #### 方法四:改进版延时函数 为了防止长时间延时导致的死循环问题,可以对延时函数进行改进,考虑分钟、秒和毫秒的综合计算[^3]。 ```csharp using System; public class Program { public static bool Delay(int ms) { DateTime now = DateTime.Now; int s; do { TimeSpan span = DateTime.Now - now; s = span.Minutes * 60 * 1000 + span.Seconds * 1000 + span.Milliseconds; System.Windows.Forms.Application.DoEvents(); } while (s < ms); return true; } public static void Main() { Console.WriteLine("开始延时..."); Delay(2000); // 延时 2 秒 Console.WriteLine("延时结束!"); } } ``` #### 方法五:使用 `Task.Delay` `Task.Delay` 是异步编程中推荐的方式,适合在现代应用程序中使用。它不会阻塞线程,而是返回一个任务对象,表示延时操作[^5]。 ```csharp using System; using System.Threading.Tasks; public class Program { public static async Task Main() { Console.WriteLine("开始延时..."); await Task.Delay(2000); // 延时 2 秒 Console.WriteLine("延时结束!"); } } ``` --- ### 总结 不同的延时实现方式适用于不同的场景。如果需要简单的延时且不关心线程阻塞,可以选择 `Thread.Sleep`;如果需要保持 UI 响应性,则可以使用 `Application.DoEvents` 或 `Task.Delay`。对于高精度延时需求,可以参考改进版延时函数或使用外部库。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值