网站首页 > 技术文章 正文
我相信大家都有经历过这样的需求,需要让程序暂停几秒后执行,我相信大家最先想到的肯定是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 当需要同时执行多个任务而不阻塞主线程时,请使用方法和任务。
- 当您需要以指定的时间间隔执行特定任务时,请使用计时器。
- 当您有内置方法无法满足的特定要求时,创建自定义等待函数。
最后,如果您还知道还有其他方式实现让程序等待几秒,麻烦您一定告诉我。谢谢!
猜你喜欢
- 2024-10-25 优秀后端都应该具备哪些开发好习惯
- 2024-10-25 分享50个让你代码更好的小建议(好用的代码)
- 2024-10-25 Spring AOP里的静态代理和动态代理,你真的了解吗?
- 2024-10-25 代码保护软件 VMProtect 用户手册之准备项目: 使用标记
- 2024-10-25 写代码有这些想法,同事才不会认为你是复制粘贴程序员
- 2024-10-25 用Java创建对象的5种不同方法(java创建对象的几种方式)
- 2024-10-25 DispatcherObject(dispatchertimer)
- 2024-10-25 WPF效果第二百一十篇之NPOI插入图片
- 2024-10-25 【译】ConfigureAwait FAQ(configgenerator翻译)
- 2024-10-25 C# 实现 Linux 视频会议(源码,支持信创环境,银河麒麟,统信UOS)
- 11-26Win7\8\10下一条cmd命令可查得笔记本电脑连接过的Wifi密码
- 11-26一文搞懂MySQL行锁、表锁、间隙锁详解
- 11-26电脑的wifi密码忘记了?一招教你如何找回密码,简单明了,快收藏
- 11-26代码解决忘记密码问题 教你用CMD命令查看所有连接过的WIFI密码
- 11-26CMD命令提示符能干嘛?这些功能你都知道吗?
- 11-26性能测试之慢sql分析
- 11-26论渗透信息收集的重要性
- 11-26如何查看电脑连接过的所有WiFi密码
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)