大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说resetevent(resetevent函数),希望您对编程的造诣更进一步.
我相信大家都有经历过这样的需求,需要让程序暂停几秒后执行,我相信大家最先想到的肯定是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($"[{DateTime.Now}] ThreadSleep 方式");
Thread.Sleep(3000); // Sleep for 3 seconds
Console.WriteLine($"[{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($"[{DateTime.Now}] DoSomethingAsync 方式");
await Task.Delay(3000); // Sleep for 3 seconds
Console.WriteLine($"[{DateTime.Now}] DoSomethingAsync 方式 after 3 seconds");
}
Task.Delay 是一种非阻塞线程的方式,它会释放当前线程,以便它可以执行其他操作。因此,它适用于 UI 线程或 ASP.NET 应用程序中。
计时器Timer
Timer 是一种计时器,它可以定期触发事件。可以使用 Timer 来实现等待几秒的操作。例如,创建一个 Timer,设置它的间隔为几秒钟,然后在事件处理程序中执行需要等待的操作。
/// <summary>
/// 方式3,定时器方式
/// </summary>
static void TimersTimer()
{
Console.WriteLine($"[{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($"[{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($"[{DateTime.Now}] CustomWaitAsync 方式");
await CustomWaitAsync(3000); // Sleep for 3 seconds
Console.WriteLine($"[{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($"[{DateTime.Now}] ManualReset 方式");
var resetEvent = new ManualResetEvent(false);
var thread = new Thread(() =>
{
resetEvent.WaitOne(3000);
Console.WriteLine($"[{DateTime.Now}] ManualReset 方式 after 3 seconds");
});
thread.Start();
}
最后给出本文测试结果:
/// <summary>
/// 测试入口
/// </summary>
public static async Task Test()
{
Console.WriteLine($"[{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 当需要同时执行多个任务而不阻塞主线程时,请使用方法和任务。
- 当您需要以指定的时间间隔执行特定任务时,请使用计时器。
- 当您有内置方法无法满足的特定要求时,创建自定义等待函数。
最后,如果您还知道还有其他方式实现让程序等待几秒,麻烦您一定告诉我。谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/28534.html