【C#】当重复使用一段代码倒计时时,使用普通类和静态方法,实现简单的封装性、可扩展性、可维护性

欢迎来到《小5讲堂》
大家好,我是全栈小5。
这是《C#》序列文章,每篇文章将以博主理解的角度展开讲解,
特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。
温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!

在这里插入图片描述

目录

  • 背景
  • 优化前
    • 界面
    • 代码
  • 优化后
    • 界面
    • 代码
  • 常见情况
    • 报错提示
    • 解决方法
    • 属性作用
  • 总结

背景

闲暇时,会使用window form窗体来开发一些工具或者锻炼和验证一些知识点,为了确保运行起来的窗体不是卡住状态,
所以就会在窗体的指定位置,比如,左上角或者右下角的位置加一个label标签,用于显示当前时间,yyyy-MM-dd HH:mm:ss。
因为这个当前时间是通过Task异步方法进行每隔一秒赋值一次时间值来实现当前动态时间效果。

优化前

优化前,是通过在每个窗体添加一段倒计时异步方法代码,然后窗体界面添加一个label标签用于显示当前实时时间。

界面

在这里插入图片描述
在这里插入图片描述

代码

/// <summary>
/// 倒计时
/// </summary>
private void CurrentTime()
{
    Task.Run(() =>
    {
        while (true)
        {
            lbTime.Text = $"当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";

            Thread.Sleep(1000);
        }
    });
}

优化后

为什么要优化!假如不优化,会有如下这种情况
1)如果只有2、3个窗体,那么多复制几次没多大影响
2)如果有100个窗体,每个窗体都复制一遍,就是重复了100次这样的代码,方法要是改动了,就要改100次
基于上面情况,可以封装成公共方法,可设计成静态公共方法。

界面

在这里插入图片描述

代码

  • 封装方法
/// <summary>
/// 普通类静态方法
/// 对于静态方法,类可以是普通类,也可以是静态类
/// </summary>
public class TimeLabel
{
    public static void Time(Form that, int x=0, int y=0)
    {
        Label label = new Label();
        label.Location = new Point() { X = x, Y = y };
        label.Width = 179;
        label.Height = 15;

        that.Controls.Add(label);

        Task.Run(() => {
                
            while(true)
            {
                label.Text = $"当前时间:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}";
                Thread.Sleep(1000);
            }
        });
    }
}
  • 窗体1
private void Test1_Load(object sender, EventArgs e)
{
    TimeLabel.Time(this, 50, 50);
}

private void button1_Click(object sender, EventArgs e)
{
    Test2 test2 = new Test2();
    test2.Show();
}
  • 窗体2
private void Test2_Load(object sender, EventArgs e)
{
    TimeLabel.Time(this, 50, 50);
}

常见情况

报错提示

在窗体异步方法里操作主线程控件时,会提示错误,线程间操作无限:从不不是创建控件"lbTime"的线程访问它。
在这里插入图片描述

解决方法

可在构造函数里增加下面代码

/// <summary>
/// 构造函数
/// </summary>
public TestTemp()
{
    InitializeComponent();
    CheckForIllegalCrossThreadCalls = false;
}

属性作用

CheckForIllegalCrossThreadCalls 可以拆分成 4 个词:
1.Check:检查
2.For:为了
3.Illegal:非法的
4.CrossThreadCalls:跨线程调用
整体意思是:为了检查跨线程调用是否非法。

C# 中的 CheckForIllegalCrossThreadCalls 是一个属性,用于检查在多线程编程中是否存在潜在的跨线程调用问题。
它可以帮助开发人员在开发过程中更好地处理线程间的通信。

在 C# 中,UI 线程是用于处理用户界面操作的主线程,而其他操作(如网络请求、计算等)通常需要在后台线程中执行。
然而,直接在后台线程中访问 UI 控件是不安全的,可能会导致不可预测的结果和操作系统错误。
CheckForIllegalCrossThreadCalls 属性的作用是在调试模式下,检测程序是否存在不安全的跨线程调用。

当该属性设置为 true 时,在出现跨线程调用时,会引发一个异常,以提醒开发人员进行相应的处理。
当属性设置为 false 时,不会引发异常,但仍然可能导致不安全的操作。

这个属性主要用于帮助开发人员及时发现并修复由于线程之间的错误调用而导致的问题。
它可以提高应用程序的稳定性和可靠性,避免潜在的线程安全问题。
要注意的是,这个属性只在调试模式下起作用,在发布版本中不会进行检查。

总结

  • 封装性
    把一个段重复使用的代码,封装成一个公共调用的方法,实现了编程的封装特性。
    封装成公共方法后,代码也比较简洁。

  • 可扩展性
    在公共方法里,又可以统一进行方法扩展和改造

  • 可维护性
    如果有100处地方都要修改,那么工作量就大了。如果只需要修改一个地方,对于维护成本就大大降低

温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/314148.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录刷题第四十八天| 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

代码随想录刷题第四十八天 今天是打家劫舍三部曲&#xff0c;最后一题树形dp有点难&#xff0c;其他还好 打家劫舍 (LC 198) 题目思路&#xff1a; 代码实现&#xff1a; class Solution:def rob(self, nums: List[int]) -> int:dp [0 for _ in range(len(nums)1)]dp[1…

Go并发快速入门:Goroutine

Go并发&#xff1a;Goroutine 1.并发基础概念&#xff1a;进程、线程、协程 (1) 进程 可以比作食材加工的一系列动作 进程就是程序在操作系统中的一次执行过程&#xff0c;是由系统进行资源分配和调度的基本单位&#xff0c;进程是一个动态概念&#xff0c;是程序在执行过程…

【生产者消费者模型的 Java 实现】

文章目录 前言传统派维新派 前言 题目&#xff1a;一个初始值为零的变量&#xff0c;多个线程对其交替操作&#xff0c;分别加1减1 实现步骤&#xff1a; 线程操作资源类判断&#xff0c;干活&#xff0c;通知防止虚假唤醒机制&#xff0c;即&#xff1a;多线程的判断需要用…

车规MCU开发之E2E协议

啥是E2E&#xff1f; E2E的原理&#xff1a; 1. 发送端&#xff1a;发送数据包添加E2E保护头 2. 接收端&#xff1a;接收数据包校验E2E保护头 E2E例子 - profile 11为例 E2E_P11ConfigType wk_stP11Cfg { .CounterOffset 8, .CRCOffset 0, .DataID …

2024年免费服务器活动整理汇总

随着科技的发展&#xff0c;服务器在各行各业的应用越来越广泛&#xff0c;而免费服务器活动也成为了许多企业和个人关注的焦点。目前有许多免费服务器活动可供选择&#xff0c;本文将为大家整理汇总免费服务器活动&#xff0c;帮助大家更好地了解和参与。 一、腾讯云免费服务器…

C语言指针相关知识(初阶)

目录 指针是什么 指针变量的大小 指针和指针类型 指针类型的意义 野指针 指针运算 指针-整数 指针-指针 指针的关系运算 指针和数组 二级指针 二级指针定义 指针数组 指针数组的定义 指针是什么 如下图所示&#xff08;右侧编号为内存地址&#xff09;&#xff1…

修改Echarts图表的标题和副标题的内容

直接上代码 var graphicConfig [ { type: "text", left: "center", top: "center", style: { text: "包日", // 初始化为空字符串 textAlign: "center", fill: "#000", fontSize: 14, fontWeight: "bold&qu…

Casper Labs 与 IBM Consulting 合作,AI透明度、审计能力的新方案

​ “全新解决方案&#xff0c;旨在帮助企业更有效地管理训练数据&#xff0c;这些数据由不同的组织通过生成式人工智能系统产生” 企业区块链软件和服务提供商 Casper Labs 与 IBM Consulting 共同宣布&#xff0c;它们将联手推出新的解决方案&#xff0c;以帮助客户在其人工…

day-07 统计出现过一次的公共字符串

思路 用哈希表统计words1和words2中各个字符串的出现次数&#xff0c;次数皆为1的字符串符合题意 解题方法 //用于存储words1中各个字符串的出现次数 HashMap<String,Integer> hashMap1new HashMap<>(); //用于存储words2中各个字符串的出现次数 HashMap<Stri…

活动 | Mint Blockchain 将于 2024 年 1 月 17 号启动 MintID 限量发行活动

MintID 是 Mint Blockchain 生态的超级权益卡&#xff0c;用于探索 NFT PASS 在未来各种应用场景下的可能性。MintID 将通过限时限量有价发售的方式对外释放&#xff0c;持有人将成为 Mint Blockchain 的核心权益用户。 MintID 总量&#xff1a;10,000 枚 铸造价格&#xff1a…

方波 离散傅里叶级数 MATLAB

%方波 离散时间傅里叶变换 L 5; N 10; k [-N/2:1:N/2]; %占空比 基本周期 离散时间的参数 xn [ones(1,L),zeros(1,N-L)]; %生成方波序列 XK dfs(xn,N); magXK abs([XK(N/21:N),XK(1:N/21)]); subplot(2,2,3); stem(k,magXK); axis([-N/2,N/2,-0.5,5.5]); xlabel(k); y…

【Linux】 nohup命令使用

nohup命令 nohup是Linux和Unix系统中的一个命令&#xff0c;其作用是在终端退出时&#xff0c;让进程在后台继续运行。它的全称为“no hang up”&#xff0c;意为“不挂起”。nohup命令可以让你在退出终端或关闭SSH连接后继续运行命令。 nohup 命令&#xff0c;在默认情况下&…

python两种办法对二叉树判断是否对称

对于给定的一颗二叉树&#xff0c;需要判断其是否是对称二叉树&#xff0c;可以使用两种办法来对这个进行实现&#xff0c;分别使用深度优先搜索算法和广度优先搜索算法都可以完成。 首先考虑一下二叉树的对称&#xff0c;什么样的二叉树是对称二叉树&#xff0c;就是如果对所…

第11章 GUI Page495~496 步骤三十一:另存为别的文件

当前的TrySaveFile(bool hint_on_dirty true)有两个特征无法满足“另存”的需求&#xff1a; 一&#xff0c;TrySaveFile仅在数据为“新”的时候才提问用户输入文件名。而“另存”总是要求用户输入一个文件名&#xff0c;多以它总应该弹出一个文件选择对话框&#xff0c;这也…

2024年CES展会都有些啥?亮点集锦都在这里

&#x1f4a1; 大家好&#xff0c;我是可夫小子&#xff0c;《小白玩转ChatGPT》专栏作者&#xff0c;关注AIGC、读书和自媒体。 CES在科技界是一场盛会&#xff0c;被誉为科技界的春晚&#xff0c;展会上前沿的技术、概念的产品吸引不少关注。2024年CES是在2023年大语言模型…

Java SE入门及基础(9)

if选择结构 1. 基本if选择结构 语法 if ( 条件 ){ // 如果条件满足&#xff0c;则执行代码块 //代码块 } 案例 从控制台输入一个整数&#xff0c;如果该数字小于 10 &#xff0c;则输出 10 与该数字的差值。 流程图 代码实现 public class Example1 { public s…

如何实现网页当前页面刷新功能

类似于这样的页面 实现思路如下&#xff1a; 首先我们在pinia中定义一个刷新状态的字段&#xff0c;点击按钮的时候&#xff0c;改为相反的值对主页面的路由跳转Router-view绑定一个v-if,它绑定一个自定义的一个响应的参数&#xff0c;我们在主页面监听pinia的刷新状态数据&am…

紫光展锐5G扬帆出海 | Blade系列勇当拉美5G先锋

5G对拉丁美洲&#xff08;简称“拉美”&#xff09;绝大多数消费者来说还是一个新鲜技术。GSMA报告显示&#xff0c;过去五年&#xff0c;拉美运营商在移动网络方面的资本开支大部分用于部署4G网络。但在5G网络方面拉美也在积极大力投入中&#xff0c;紧跟全球5G发展大潮&#…

软件测试|Beautiful Soup库详细使用指南

简介 Beautiful Soup是一款强大的Python库&#xff0c;广泛用于解析HTML和XML文档&#xff0c;从中提取数据并进行处理。它的灵活性和易用性使得数据抽取变得简单&#xff0c;本文将详细介绍Beautiful Soup库的基本用法和示例。 安装Beautiful Soup 首先&#xff0c;需要确保…

软件测试工程师如何对算法做测试?

最近几年&#xff0c;随着大数据、人工智能等领域的快速发展&#xff0c;算法受到前所未有的重视&#xff0c;算法测试也随之兴起。 为了让大家能对算法测试有个初步的了解&#xff0c;这篇文章将对“如何做算法测试”进行梳理&#xff0c;大纲如下&#xff1a; 1、算法测试测…