欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#中倒計(jì)時(shí)功能的優(yōu)化方法小結(jié)

 更新時(shí)間:2024年01月14日 09:31:44   作者:全棧小5  
這篇文章主要為大家詳細(xì)介紹了當(dāng)C#重復(fù)使用一段代碼倒計(jì)時(shí)時(shí),如何使用普通類和靜態(tài)方法,實(shí)現(xiàn)簡(jiǎn)單的代碼封裝性、可擴(kuò)展性、可維護(hù)性,感興趣的可以了解下

背景

閑暇時(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)文章

最新評(píng)論