C#中倒計(jì)時(shí)功能的優(yōu)化方法小結(jié)
背景
閑暇時(shí),會(huì)使用window form窗體來(lái)開(kāi)發(fā)一些工具或者鍛煉和驗(yàn)證一些知識(shí)點(diǎn),為了確保運(yùn)行起來(lái)的窗體不是卡住狀態(tài),
所以就會(huì)在窗體的指定位置,比如,左上角或者右下角的位置加一個(gè)label標(biāo)簽,用于顯示當(dāng)前時(shí)間,yyyy-MM-dd HH:mm:ss。
因?yàn)檫@個(gè)當(dāng)前時(shí)間是通過(guò)Task異步方法進(jìn)行每隔一秒賦值一次時(shí)間值來(lái)實(shí)現(xiàn)當(dāng)前動(dòng)態(tài)時(shí)間效果。
優(yōu)化前
優(yōu)化前,是通過(guò)在每個(gè)窗體添加一段倒計(jì)時(shí)異步方法代碼,然后窗體界面添加一個(gè)label標(biāo)簽用于顯示當(dāng)前實(shí)時(shí)時(shí)間。
界面
代碼
/// <summary> /// 倒計(jì)時(shí) /// </summary> private void CurrentTime() { Task.Run(() => { while (true) { lbTime.Text = $"當(dāng)前時(shí)間:{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}"; Thread.Sleep(1000); } }); }
優(yōu)化后
為什么要優(yōu)化!假如不優(yōu)化,會(huì)有如下這種情況
1)如果只有2、3個(gè)窗體,那么多復(fù)制幾次沒(méi)多大影響
2)如果有100個(gè)窗體,每個(gè)窗體都復(fù)制一遍,就是重復(fù)了100次這樣的代碼,方法要是改動(dòng)了,就要改100次
基于上面情況,可以封裝成公共方法,可設(shè)計(jì)成靜態(tài)公共方法。
界面
代碼
封裝方法
/// <summary> /// 普通類靜態(tài)方法 /// 對(duì)于靜態(tài)方法,類可以是普通類,也可以是靜態(tài)類 /// </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 = $"當(dāng)前時(shí)間:{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); }
常見(jiàn)情況
報(bào)錯(cuò)提示
在窗體異步方法里操作主線程控件時(shí),會(huì)提示錯(cuò)誤,線程間操作無(wú)限:從不不是創(chuàng)建控件"lbTime"的線程訪問(wèn)它。
解決方法
可在構(gòu)造函數(shù)里增加下面代碼
/// <summary> /// 構(gòu)造函數(shù) /// </summary> public TestTemp() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; }
屬性作用
CheckForIllegalCrossThreadCalls 可以拆分成 4 個(gè)詞:
1.Check:檢查
2.For:為了
3.Illegal:非法的
4.CrossThreadCalls:跨線程調(diào)用
整體意思是:為了檢查跨線程調(diào)用是否非法。
C# 中的 CheckForIllegalCrossThreadCalls 是一個(gè)屬性,用于檢查在多線程編程中是否存在潛在的跨線程調(diào)用問(wèn)題。
它可以幫助開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中更好地處理線程間的通信。
在 C# 中,UI 線程是用于處理用戶界面操作的主線程,而其他操作(如網(wǎng)絡(luò)請(qǐng)求、計(jì)算等)通常需要在后臺(tái)線程中執(zhí)行。
然而,直接在后臺(tái)線程中訪問(wèn) UI 控件是不安全的,可能會(huì)導(dǎo)致不可預(yù)測(cè)的結(jié)果和操作系統(tǒng)錯(cuò)誤。
CheckForIllegalCrossThreadCalls 屬性的作用是在調(diào)試模式下,檢測(cè)程序是否存在不安全的跨線程調(diào)用。
當(dāng)該屬性設(shè)置為 true 時(shí),在出現(xiàn)跨線程調(diào)用時(shí),會(huì)引發(fā)一個(gè)異常,以提醒開(kāi)發(fā)人員進(jìn)行相應(yīng)的處理。
當(dāng)屬性設(shè)置為 false 時(shí),不會(huì)引發(fā)異常,但仍然可能導(dǎo)致不安全的操作。
這個(gè)屬性主要用于幫助開(kāi)發(fā)人員及時(shí)發(fā)現(xiàn)并修復(fù)由于線程之間的錯(cuò)誤調(diào)用而導(dǎo)致的問(wèn)題。
它可以提高應(yīng)用程序的穩(wěn)定性和可靠性,避免潛在的線程安全問(wèn)題。
要注意的是,這個(gè)屬性只在調(diào)試模式下起作用,在發(fā)布版本中不會(huì)進(jìn)行檢查。
總結(jié)
1.封裝性
把一個(gè)段重復(fù)使用的代碼,封裝成一個(gè)公共調(diào)用的方法,實(shí)現(xiàn)了編程的封裝特性。
封裝成公共方法后,代碼也比較簡(jiǎn)潔。
2.可擴(kuò)展性
在公共方法里,又可以統(tǒng)一進(jìn)行方法擴(kuò)展和改造
3.可維護(hù)性
如果有100處地方都要修改,那么工作量就大了。如果只需要修改一個(gè)地方,對(duì)于維護(hù)成本就大大降低
以上就是C#中倒計(jì)時(shí)功能的優(yōu)化方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于C#倒計(jì)時(shí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#編程實(shí)現(xiàn)連接ACCESS數(shù)據(jù)庫(kù)實(shí)例詳解
這篇文章主要介紹了C#編程實(shí)現(xiàn)連接ACCESS數(shù)據(jù)庫(kù)的方法,以實(shí)例形式較為詳細(xì)的分析了C#連接access數(shù)據(jù)庫(kù)的具體步驟與相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11WinForm 自動(dòng)完成控件實(shí)例代碼簡(jiǎn)析
在Web的應(yīng)用方面有js的插件實(shí)現(xiàn)自動(dòng)完成(或叫智能提示)功能,但在WinForm窗體應(yīng)用方面就沒(méi)那么好了,接下來(lái)參考一下這個(gè)實(shí)例,看看有沒(méi)有以外收獲,感興趣的朋友可以了解下啊,希望本文對(duì)你有幫助啊2013-01-01C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼
這篇文章主要介紹了C#實(shí)現(xiàn)打印與打印預(yù)覽功能的思路及代碼,有需要的朋友可以參考一下2013-12-12C#實(shí)現(xiàn)對(duì)象的序列化和反序列化
這篇文章介紹了C#實(shí)現(xiàn)對(duì)象序列化和反序列化的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07