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