C#使用DateTime.Now静态属性动态获得系统当前日期和时间
目录
一、实例
1.源码
2.生成效果
二、相关知识点
1.Thread类
(1)Thread.Sleep()方法
(2)Thread(ThreadStart)
(3)IsBackground
(4)Invoke( )
2.CreateGraphics()
3.DateTime.Now
4.(MethodInvoker)delegate ()
使用DateTime结构的Now静态属性可以轻松地获取当前系统时间。
DateTime结构的Now静态属性只是得到一个系统时间对象,该时间对象不会随着系统时间的变化而变化,如果要动态显示系统时间,可以使用计时器间隔地获取系统时间对象并显示。
可以适当地使用线程替代Timer控件。在窗体应用程序开发过程中,应当尽量避免使用窗体线程做高强度的运算或IO操作,如果窗体线程参与了过多的运算,会导致用户的操作不能及时分配到资源,用户界面会出现卡或无响应情况。
一、实例
1.源码
//使用DateTime的Now静态属性动态获取系统时间
namespace _053
{public partial class Form1 : Form{public Form1(){InitializeComponent();Load += Form1_Load;}private void Form1_Load(object? sender, EventArgs e){SuspendLayout();// // Form1// AutoScaleDimensions = new SizeF(7F, 17F);AutoScaleMode = AutoScaleMode.Font;ClientSize = new Size(394, 41);Name = "Form1";StartPosition = FormStartPosition.CenterScreen;Text = "动态获取系统时间"; ResumeLayout(false);Thread thread = new(//创建线程() => //使用lambda表达式{while (true) //无限循环{Invoke( //操作窗体线程(MethodInvoker)delegate ()//使用匿名方法{Refresh();//刷新窗体Graphics graphics = CreateGraphics(); //创建绘图对象graphics.DrawString("系统时间:" + //在窗体中绘出系统时间DateTime.Now.ToString("yyyy年MM月dd日 HH时mm分ss秒"),new Font("Times New Roman", 14),Brushes.Blue,new Point(10, 10));});Thread.Sleep(1000);//线程挂起1秒钟}}){IsBackground = true //将线程设置为后台线程};thread.Start(); //线程开始执行}}
}
2.生成效果

二、相关知识点
1.Thread类
创建和控制线程,设置其优先级并获取其状态。
(1)Thread.Sleep()方法
将当前线程挂起指定的时间。
- 重载
Sleep(Int32) | 将当前线程挂起指定的毫秒数。 |
Sleep(TimeSpan) | 将当前线程挂起指定的时间。 |
- Sleep(Int32)
将当前线程挂起指定的毫秒数。
public static void Sleep (int millisecondsTimeout);参数
millisecondsTimeout Int32
挂起线程的毫秒数。 如果 millisecondsTimeout 参数的值为零,则该线程会将其时间片的剩余部分让给任何已经准备好运行的、具有同等优先级的线程。 如果没有其他已经准备好运行的、具有同等优先级的线程,则不会挂起当前线程的执行。例外
ArgumentOutOfRangeException
超时值为负且不等于 Infinite。
// Sleep(Int32)
// 使用 Sleep 方法来阻止应用程序的main线程。
namespace ConsoleApp12
{class Example{static void Main(){for (int i = 0; i < 5; i++){Console.WriteLine("Sleep for 2 seconds.");Thread.Sleep(2000);}Console.WriteLine("Main thread exits.");}}
}/* 运行结果:
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Main thread exits.*/
- Sleep(TimeSpan) 将当前线程挂起指定的时间。
public static void Sleep (TimeSpan timeout);参数
timeout TimeSpan
挂起线程的时间量。 如果 timeout 参数的值为 Zero,则该线程会将其时间片的剩余部分让给任何已经准备好运行的、具有同等优先级的线程。 如果没有其他已经准备好运行的、具有同等优先级的线程,则不会挂起当前线程的执行。例外
ArgumentOutOfRangeException
的 timeout 值为负,不等于 Infinite 以毫秒为单位,或大于 Int32.MaxValue 毫秒。
// Sleep(TimeSpan)
// 使用 Sleep(TimeSpan) 方法重载来阻止应用程序的main线程五次,每次两秒。
namespace ConsoleApp13
{class Example{static void Main(){TimeSpan interval = new(0, 0, 2);for (int i = 0; i < 5; i++){Console.WriteLine("Sleep for 2 seconds.");Thread.Sleep(interval);}Console.WriteLine("Main thread exits.");}}
}
/* 运行结果:
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Sleep for 2 seconds.
Main thread exits.*/
(2)Thread(ThreadStart)
初始化 Thread 类的新实例。
public Thread (System.Threading.ThreadStart start);参数
start ThreadStart
表示开始执行此线程时要调用的方法的 ThreadStart 委托。例外
ArgumentNullException
start 参数为 null。
// Thread(ThreadStart)
// 创建并执行静态方法的线程
namespace ConsoleApp10
{class Test{ static void Main(){Work.DoWork();Thread newthread = new(Work.DoWork); //创建线程=把要处理的方法放进这个线程Thread newThread = new(new ThreadStart(Work.DoWork)); //等效语句newthread.Start();newThread.Start();}}class Work{ public static void DoWork(){Console.WriteLine("Thread newThread=new()和 newThread.Start()总是成对出现的,");Console.WriteLine("前者负责创建一个新线程,后者负责执行这个线程");}}
}
// 运行结果:
/*
Thread newThread=new()和 newThread.Start()总是成对出现的,
前者负责创建一个新线程,后者负责执行这个线程
Thread newThread=new()和 newThread.Start()总是成对出现的,
前者负责创建一个新线程,后者负责执行这个线程
Thread newThread=new()和 newThread.Start()总是成对出现的,
前者负责创建一个新线程,后者负责执行这个线程*/
// 创建执行实例方法的线程
namespace ConsoleApp11
{class Test{static void Main(){Work threadWork = new(); //创建实例方法Thread newthread = new(Work.DoWork); Thread newThread = new(new ThreadStart(Work.DoWork));newthread.Start();newThread.Start();}}class Work{public static void DoWork(){Console.WriteLine("Thread newThread=new()和 newThread.Start()总是成对出现的,");Console.WriteLine("前者负责创建一个新线程,后者负责执行这个线程");}}
}
//运行结果:
/*
Thread newThread=new()和 newThread.Start()总是成对出现的,
前者负责创建一个新线程,后者负责执行这个线程
Thread newThread=new()和 newThread.Start()总是成对出现的,
前者负责创建一个新线程,后者负责执行这个线程*/
(3)Thread.IsBackground 属性
获取或设置一个值,该值指示某个线程是否为后台线程。
public bool IsBackground { get; set; }属性值
Boolean
如果此线程为或将成为后台线程,则为 true;否则为 false。例外
ThreadStateException
线程终止。
// Thread.IsBackground 属性
// 创建前台线程和后台线程,对前台线程和后台线程的行为进行对比。
// 前台线程使进程保持运行,直到完成其 for 循环并终止。
// 由于前台线程已完成执行,因此后台线程将终止进程。
namespace ConsoleApp15
{class Example{static void Main(){BackgroundTest shortTest = new(5);Thread foregroundThread =new(new ThreadStart(shortTest.RunLoop));BackgroundTest longTest = new(50);Thread backgroundThread =new(new ThreadStart(longTest.RunLoop)){IsBackground = true};foregroundThread.Start();backgroundThread.Start();}}class BackgroundTest(int maxIterations){readonly int maxIterations = maxIterations;public void RunLoop(){for (int i = 0; i < maxIterations; i++){Console.WriteLine("{0} count: {1}",Thread.CurrentThread.IsBackground ?"Background Thread" : "Foreground Thread", i);Thread.Sleep(250);}Console.WriteLine("{0} finished counting.",Thread.CurrentThread.IsBackground ?"Background Thread" : "Foreground Thread");}}
}
// 运行结果:
/*
Foreground Thread count: 0
Background Thread count: 0
Background Thread count: 1
Foreground Thread count: 1
Background Thread count: 2
Foreground Thread count: 2
Background Thread count: 3
Foreground Thread count: 3
Background Thread count: 4
Foreground Thread count: 4
Background Thread count: 5
Foreground Thread finished counting.*/
(4)Invoke( )
详见本文作者发表的其他文章,C#用Parallel.Invoke 方法尽可能并行执行提供的每个操作-CSDN博客 https://wenchm.blog.csdn.net/article/details/135697802
2.CreateGraphics()
3.DateTime.Now
4.(MethodInvoker)delegate ()
5.TimeSpan(Int32, Int32, Int32)
将 TimeSpan 结构的新实例初始化为指定的小时数、分钟数和秒数。
(1)定义
public TimeSpan (int hours, int minutes, int seconds);参数
hours Int32
小时数。minutes Int32
分钟数。seconds Int32
秒数。例外
ArgumentOutOfRangeException
参数指定小于 TimeSpanTimeSpan.MinValue 或大于 TimeSpan.MaxValue 的值。注解
将指定的 hours、 minutes和 seconds 转换为时钟周期,该值初始化此实例。
(2)示例
// Example of the TimeSpan( int, int, int ) constructor.
// 创建多个 TimeSpan 对象,该重载将 初始化 TimeSpan 为指定的小时数、分钟数和秒数。
namespace ConsoleApp14
{class TimeSpanCtorIIIDemo{static void CreateTimeSpan(int hours, int minutes,int seconds){TimeSpan elapsedTime = new(hours, minutes, seconds);string ctor = string.Format("TimeSpan( {0}, {1}, {2} )",hours, minutes, seconds); Console.WriteLine("{0,-37}{1,16}",ctor, elapsedTime.ToString());//输出格式}static void Main(){Console.WriteLine("This example of the TimeSpan( int, int, int ) " +"\nconstructor generates the following output.\n");Console.WriteLine("{0,-37}{1,16}", "Constructor", "Value"); //{0,-37}代表左对齐长度不足时空格抵Console.WriteLine("{0,-37}{1,16}", "-----------", "-----"); //{1,16}代表右对齐,长度不足时空格抵CreateTimeSpan(10, 20, 30);CreateTimeSpan(-10, 20, 30);CreateTimeSpan(0, 0, 37230);CreateTimeSpan(1000, 2000, 3000);CreateTimeSpan(1000, -2000, -3000);CreateTimeSpan(999999, 999999, 999999);}}
}
/*
This example of the TimeSpan( int, int, int )
constructor generates the following output.Constructor Value
----------- -----
TimeSpan( 10, 20, 30 ) 10:20:30
TimeSpan( -10, 20, 30 ) -09:39:30
TimeSpan( 0, 0, 37230 ) 10:20:30
TimeSpan( 1000, 2000, 3000 ) 43.02:10:00
TimeSpan( 1000, -2000, -3000 ) 40.05:50:00
TimeSpan( 999999, 999999, 999999 ) 42372.15:25:39
*/
相关文章:

C#使用DateTime.Now静态属性动态获得系统当前日期和时间
目录 一、实例 1.源码 2.生成效果 二、相关知识点 1.Thread类 (1)Thread.Sleep()方法 (2)Thread(ThreadStart) (3)IsBackground (4)Invoke( ) 2.CreateGrap…...

华为机考入门python3--(0)模拟题2-vowel元音字母翻译
分类:字符串 知识点: 字符串转list,每个字符成为list中的一个元素 list(string) 字符串变大小写 str.upper(), str.lower() 题目来自【华为招聘模拟考试】 # If you need to import additional packages or classes, please import …...

【轮式平衡机器人】——角度/速度/方向控制分析软件控制框架
轮式平衡机器人具有自不稳定性,可类比一级倒立摆系统的控制方法,常见有反馈线性化方法、非线性PID控制、自适应控制、自抗扰控制,还有改进的传统缺乏对外界干扰和参数改变鲁棒性的滑模变结构控制。我们采用较为简单的双闭环PID控制实现平衡模…...

HYBBS 表白墙网站PHP程序源码 可封装成APP
源码介绍 PHP表白墙网站源码,可以做校园内的,也可以做校区间的,可封装成APP。告别QQ空间的表白墙吧。 安装PHP5.6以上随意 上传程序安装,然后设置账号密码,登陆后台切换模板手机PC都要换开启插件访问前台。 安装完…...

【设计模式】适配器和桥接器模式有什么区别?
今天我探讨一下适配器模式和桥接模式,这两种模式往往容易被混淆,我们希望通过比较他们的区别和联系,能够让大家有更清晰的认识。 适配器模式:连接不兼容接口 当你有一个类的接口不兼容你的系统,而你又不希望修改这个…...

C语言应用层程序热补丁
一、热补丁简介 一个正在运行的程序,要是有某函数或某流程有问题,需要修改,有两个方式: 1.通过设置LD_PRELOAD把需要的库重新定向,但这种方式需要重启正在运行的程序。 2.通过修改可执行文件某个函数指向的地址&…...

【代码随想录+力扣hot100】双指针
文章目录 27. 移除元素思路:代码: 26. 删除有序数组中的重复项代码:思路一:重复元素必相邻思路二:从第一个位置开始考虑快慢指针 977.有序数组的平方思路:代码: 283. 移动零代码:思路…...

【Java程序员面试专栏 专业技能篇】MySQL核心面试指引(三):性能优化策略
关于MySQL部分的核心知识进行一网打尽,包括三部分:基础知识考察、核心机制策略、性能优化策略,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第三部分:性能优化策略,子节点表示追问或同级提问 读写分离 分布式数据库的…...

qnx 上screen + egl + opengles 最简实例
文章目录 前言一、qnx 上的窗口系统——screen二、screen + egl + opengles 最简实例1.使用 addvariant 命令创建工程目录2. 添加源码文件3. common.mk 文件4. 编译与执行总结参考资料前言 本文主要介绍如何在QNX 系统上使用egl和opengles 控制GPU渲染一个三角形并显示到屏幕上…...

python基础学习-02
基本的程序设计模式 任何的程序设计都包含IPO,它们分别代表如下: I:Input 输入,程序的输入 P:Process 处理,程序的主要逻辑过程 O:Output 输出,程序的输出 因此如果想要通过计算…...

服务调用Ribbon,LoadBalance,Feign
服务调用Ribbon、Fegin Ribbon实现负载均衡的原理 1:LoadBalancerAutoConfiguration这个类,这个类主要做的就是把LoadBalancer拦截器封装到RestTemplte拦截器集合里面去。 2:然后在代码里面调用restTemplate.getForObject或者其他方法的时候&…...

一条sql是如何运行的
在我们平时使用sql的时候,基本是基于黑盒的使用方式,在客户端输入一条sql语句,然后回显想要的数据,对于mysql server端内部如何运行的以及与存储引擎如何交互的不得而知。 通过下面一幅图,大致描述客户端和服务端交互…...

SystemC学习笔记(三) - 查看模块的波形
简述 波形在Simulation/Emulation中地位十分重要,尤其是在研发初期,只能通过波形来查看软件hang住的位置。 对于TLM来说,查看波形一般是指查看pvbus上的transaction,而对于SystemC本身来说,查看波形就是使用Gtkwave或…...

计算机网络(第六版)复习提纲5
SS2.2 有关信道的几个基本概念 2.通信模型 三个主要部分:信源、信道、信宿 3.通信方式: a)术语:消息(传递的内容)、数据(传递的形式)、信号(数据表现形式,有模拟信号和数字信号两种&…...

JavaScript 学习笔记(WEB APIs Day3)
「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. JavaScript 学习笔记(Day1) 2. JavaSc…...

Springboot自动装配:三个注解、Selector、spring.factories文件、@ConditionalOnProperty注解
借鉴: 这个链接是包含run方法进来debug看整个过程的,建议先看:https://www.cnblogs.com/starsray/p/15580915.html https://blog.csdn.net/fengxiandada/article/details/130080828 Springboot自动装配 1.创建springboot应用 如何创建一个s…...

软件工程应用题汇总
绘制数据流图(L0/L1/L2) DFD/L0(基本系统模型) 只包含源点终点和一个处理(XXX系统) DFD/L1(功能级数据流图)在L0基础上进一步划分处理(XXX系统) 个人理解 DFD/L2(在L1基础上进一步分解后的数据流图) 数据…...

P1789 【Mc生存】插火把(C语言)
首先,我们可以先用数组来储存地图(建议用int,我试过bool会RE) 每次读入火把和萤石的坐标 接着把能照亮的地方标记起来 最后用计数器统计会生成怪的地方有钻石的话还怕怪吗 最后,上代码 #include<stdio.h> i…...

计算机网络(第六版)复习提纲6
SS2.3 导引型传输媒体 1.三类位非导引型传输媒体 a)双绞线:两根铜线平行会相互干扰,垂直干扰最小,双绞线近似垂直,绞合度越高,可用的数据传输率越高。 i.无屏蔽双绞线UTP(便宜) ii.屏蔽双绞线&a…...

安卓平板局域网内远程控制工控机方法
安卓平板局域网内远程控制工控机方法 将所需要远程控制的工控机通过网线连接到具有WiFi功能的路由器上,将安卓平板连接上WiFi,如下图所示 下载NoMachine远程软件安装包,官网地址:https://www.nomachine.com/ 点击Download now按钮…...

pinctrl子系统简介
一. 简介 上一章我们编写了基于设备树的 LED 驱动,但是驱动的本质还是没变,都是配置 LED 灯所使用的 GPIO 寄存器,驱动开发方式和裸机基本没啥区别。 Linux 是一个庞大而完善的系统, 尤其是驱动框架,像 GPIO …...

基于51单片机的温度报警控制系统Protues仿真设计
目录 一、设计背景 二、实现功能 三、总体硬件设计 四、仿真演示 四、源程序 一、设计背景 随着现代工农业技术的发展及人们对生活环境要求的提高,人们也迫切需要检测与了解环境温度。特别地,高温情况下极易造成火灾,例如,在…...

多级缓存
一、多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时ÿ…...

【已解决】如何用typedef简化函数指针
博文内容简短,主要介绍typedef简化函数指针,形式是typedef int(*pp)(int,int);并用一个加法的例子去演示,如何用typedef简化函数指针。 示例 #include<stdio.h> int add(int a,int b) {return a b; } typedef int(*p)(int, int); in…...

UI网站汇总
Material Design的九大设计原则 Material Design的学习笔记 Material Design复杂响应式设计 MaterialPalette MD风格调色板 Iconfont Clipartlogo Dribbble https://dribbble.com/search?qapp Uplabs 优设 站酷 我图网 思维网 欢迎补充!!...

PLC-IoT 网关开发札记(5):将本地数据库作为资产打包发布到 App
App需求:保存物模型 什么是物模型 在项目开发中,用到了本地数据库,这个本地数据库记录了系统的物模型。所谓物模型就是对某一个设备的可操纵属性的定义,每一个设备包括了一个或者多个属性,通过获取这些属性的当前值可…...

固态硬盘优化设置
目录 前言: 关闭Windows Search 禁用系统保护(不建议) 不建议禁用系统保护原因 关闭碎片整理【机械硬盘】 提升固态硬盘速度 开启TRIM 合理使用固态硬盘的容量 正确关机 关闭开机自启 前言: 电脑配备固态硬盘就能一劳…...

SpringBoot跨域问题解决
前端访问后台接口时,浏览器报错,跨域无法访问。 报错信息如下: Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 经过一番百度之后&#…...

FindMy技术与相机结合
FindMy是苹果公司提供的设备追踪服务,用来帮助用户定位丢失的设备。自苹果公司开放Findmy网络之后,FindMy技术便与各种生活设备相结合,比如与相机的结合。 想象一下,你正在外出办事或者旅行时,突然意识到相机丢了&…...

Windows WSL2 占用磁盘空间清理释放
目前工作中时常用到WSL2(Ubuntu20.04),在使用一段时间后会发现WSL2所占用磁盘空间越来越多,体现在WSL2之上安装Linux分发对应的vhdx虚拟磁盘文件体积越来越大,会占用Windows自身空间,即使手动清理了Linux分…...