在C#中添加I/O延时和持续时间

news/2025/1/24 14:48:55/

在C#中添加I/O延时和持续时间,可以通过以下方法实现。具体来说,延时可以通过Thread.Sleep、Task.Delay等方式来模拟延迟,而持续时间的控制可以通过循环结构来设定持续的时间。在执行I/O操作时,你可以在操作之间添加延时,从而达到你想要的效果。
方法 1:使用 Thread.Sleep 模拟延迟
如果你希望在执行I/O操作时控制每个操作之间的延时,可以使用 Thread.Sleep 来暂停线程一定时间。这种方法适用于不需要异步处理的情况。
示例:延时和持续时间控制

using System;
using System.IO.Ports;
using System.Threading;
using System.Windows;namespace WpfApp
{public partial class MainWindow : Window{private SerialPort serialPort;private bool isSendingData;private int durationInSeconds = 10; // 设置持续时间为10秒public MainWindow(){InitializeComponent();InitializeSerialPort();}// 初始化串口private void InitializeSerialPort(){serialPort = new SerialPort("COM1", 9600);  // 设置串口号和波特率serialPort.Open(); // 打开串口}// 启动I/O持续发送功能private void StartSendingData(){if (isSendingData) return;isSendingData = true;DateTime startTime = DateTime.Now; // 获取开始时间while (isSendingData && (DateTime.Now - startTime).TotalSeconds < durationInSeconds){try{// 模拟发送数据到串口string dataToSend = "Hello, World!";serialPort.WriteLine(dataToSend);Console.WriteLine("Sending: " + dataToSend);// 添加延时,控制发送的频率Thread.Sleep(1000); // 每次发送数据后延时1秒}catch (Exception ex){MessageBox.Show($"Error sending data: {ex.Message}");break; // 如果发生错误,退出循环}}StopSendingData();}// 停止I/O持续发送功能private void StopSendingData(){isSendingData = false;}// 界面按钮事件示例:开始按钮private void StartButton_Click(object sender, RoutedEventArgs e){StartSendingData();}// 界面按钮事件示例:停止按钮private void StopButton_Click(object sender, RoutedEventArgs e){StopSendingData();}// 界面关闭时,关闭串口连接private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e){StopSendingData();if (serialPort.IsOpen){serialPort.Close();}}}
}

代码解释:

1.Thread.Sleep(1000):在每次发送数据后,线程会暂停1秒(1000毫秒)。这样就可以控制数据发送的频率。
2.DateTime startTime = DateTime.Now:记录开始时间,然后通过 DateTime.Now - startTime 来计算程序运行的时间,直到超过预定的持续时间(durationInSeconds)时停止发送数据。
3.while 循环:只要未超过持续时间,并且 isSendingData 为 true,就持续发送数据。

方法 2:使用异步和 Task.Delay 来模拟延时
如果你想在不阻塞主线程的情况下执行I/O操作并添加延时,可以使用 async 和 await 配合 Task.Delay。Task.Delay 是一个异步方法,它不会阻塞线程。
示例:异步延时和持续时间控制

using System;
using System.IO.Ports;
using System.Threading.Tasks;
using System.Windows;namespace WpfApp
{public partial class MainWindow : Window{private SerialPort serialPort;private bool isSendingData;private int durationInSeconds = 10; // 设置持续时间为10秒public MainWindow(){InitializeComponent();InitializeSerialPort();}// 初始化串口private void InitializeSerialPort(){serialPort = new SerialPort("COM1", 9600);  // 设置串口号和波特率serialPort.Open(); // 打开串口}// 启动I/O持续发送功能private async Task StartSendingDataAsync(){if (isSendingData) return;isSendingData = true;DateTime startTime = DateTime.Now; // 获取开始时间while (isSendingData && (DateTime.Now - startTime).TotalSeconds < durationInSeconds){try{// 模拟发送数据到串口string dataToSend = "Hello, World!";serialPort.WriteLine(dataToSend);Console.WriteLine("Sending: " + dataToSend);// 添加异步延时,避免阻塞UI线程await Task.Delay(1000); // 每次发送数据后延时1秒}catch (Exception ex){MessageBox.Show($"Error sending data: {ex.Message}");break; // 如果发生错误,退出循环}}StopSendingData();}// 停止I/O持续发送功能private void StopSendingData(){isSendingData = false;}// 界面按钮事件示例:开始按钮private async void StartButton_Click(object sender, RoutedEventArgs e){await StartSendingDataAsync();}// 界面按钮事件示例:停止按钮private void StopButton_Click(object sender, RoutedEventArgs e){StopSendingData();}// 界面关闭时,关闭串口连接private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e){StopSendingData();if (serialPort.IsOpen){serialPort.Close();}}}
}

代码解释:

4.Task.Delay(1000):替代了 Thread.Sleep,它是异步的,能够避免阻塞UI线程。每次发送数据后,程序会延时1秒。
5.async 和 await:通过这些关键字来确保异步执行,不会阻塞主线程。
6.通过 StartButton_Click 使用 await StartSendingDataAsync() 来启动数据发送过程。

总结:

1.延时控制:通过 Thread.Sleep 或 Task.Delay 控制每个I/O操作之间的延时。
2.Thread.Sleep 是同步的,会阻塞当前线程,但在某些情况下使用起来简单。
3.Task.Delay 是异步的,可以避免阻塞UI线程,更适合在WPF这样的UI应用中使用。
4.持续时间控制:通过记录开始时间和与当前时间进行比较来控制操作持续的时间。

根据你的需求,你可以选择适合的方法来添加延时和持续时间控制。


http://www.ppmy.cn/news/1565805.html

相关文章

Python 类和对象:详细讲解中篇

文章目录 Python 类和对象:详细讲解前言9. 方法重写(Method Overriding)9.1 为什么需要方法重写?9.2 方法重写的基本示例9.3 代码详解 10. 多继承(Multiple Inheritance)10.1 多继承的概念10.2 多继承的示例…

更改网络适配器

今天电脑联网,不管手机热点还是 WiFi(可以连上),网页都打不开,说是 DNS 服务器的问题,我用梯子代理它却可以正常上网。 然后我根据 csdn 和 ai 的建议改了网络适配器 【win11更改网络适配器 - CSDN App】h…

R语言基础| 回归分析

写在前面 R语言拥有丰富的数据处理、统计分析和机器学习工具包,涵盖了从简单的描述统计到复杂的模型建立的各个方面。再加上数据的处理可以完美的衔接后续的可视化,这使得它成为处理各种类型和规模的数据集的理想选择。回归分析是统计学中一种用于探究自…

Vue实现div滚动,并且支持top动态滚动

如果你知道距离目标 div 顶部的像素值,并希望通过传入 top 参数来实现滚动到对应区域,可以使用 window.scrollTo 方法。 编写滚动方法 const scrollToDiv (targetDiv, top) > {if (targetDiv) {top top * targetDiv.value.scrollHeight / data.he…

【YOLOv10改进[Backbone]】使用LSKNet替换Backbone | 用于遥感目标检测的大型选择性核网络

本文将进行在YOLOv10中使用LSKNet替换Backbone魔改v10的实践,文中含全部代码、详细修改方式。助您轻松理解改进的方法。 目录 一 LSKNet 二 魔改YOLOv10 1 整体修改 ① 添加python文件 ② 修改ultralytics/nn/tasks.py文件 2 配置文件

基于java线程池和EasyExcel实现异步导出

基于java线程池和EasyExcel实现异步导出 1.controller层 GetMapping("export") public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {exportService.exportExcel(response); }2. service public void exportExcel(H…

android12源码中用第三方APK替换原生launcher

一、前言 如何用第三方的apk替换原生launcher呢?我是参考着这位大神的博客https://blog.csdn.net/hyu001/article/details/131044358做的,完美实现。 这边博客中又加入了我个人的一些改变,整理的。 二、步骤 1.在/packages/apps/MyApp文件…

【Hadoop面试题2025】

文章目录 简单题故障及相应的处理方法中等难度高难度小文件小文件的产生小文件问题的影响小文件治理方案推荐方案 冷文件冷文件的产生冷文件问题的影响冷文件治理方案推荐方案 简单题 一、基础概念类 什么是Hadoop? 答案:Hadoop是一个开源的分布式计算框…