最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#定時(shí)器與延時(shí)操作的使用

 更新時(shí)間:2026年04月10日 09:47:19   作者:一杯拿鐵丨  
本文詳細(xì)介紹了C#開發(fā)中常用的定時(shí)器與延時(shí)機(jī)制,主要內(nèi)容包括 定時(shí)器類對比,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

引言

在 C# 開發(fā)的廣袤領(lǐng)域中,定時(shí)器與延時(shí)機(jī)制宛如隱匿在幕后的精密齒輪,悄無聲息卻又至關(guān)重要地推動著程序的高效運(yùn)轉(zhuǎn)。它們是構(gòu)建復(fù)雜邏輯和實(shí)現(xiàn)特定功能的基石,為開發(fā)者提供了對程序執(zhí)行時(shí)間的精準(zhǔn)把控。

定時(shí)器,如同一位不知疲倦的時(shí)間管家,按照預(yù)設(shè)的時(shí)間間隔準(zhǔn)時(shí)觸發(fā)事件,執(zhí)行特定的代碼塊。在數(shù)據(jù)處理中,我們常常需要定時(shí)從數(shù)據(jù)庫中獲取最新數(shù)據(jù),進(jìn)行實(shí)時(shí)分析與展示;在網(wǎng)絡(luò)通信中,定時(shí)發(fā)送心跳包以維持連接的穩(wěn)定性,確保信息的順暢傳輸。這些場景都離不開定時(shí)器的助力,它讓程序能夠有條不紊地按照既定節(jié)奏工作,實(shí)現(xiàn)各種自動化任務(wù)。

而延時(shí),則像是為程序執(zhí)行流程按下了 “暫停鍵”,讓特定的操作在經(jīng)過一段指定的時(shí)間后再執(zhí)行。當(dāng)我們啟動一個(gè)程序時(shí),可能需要延時(shí)片刻,等待系統(tǒng)資源的初始化和加載,確保程序后續(xù)的穩(wěn)定運(yùn)行;在用戶交互過程中,為了避免頻繁操作導(dǎo)致的系統(tǒng)壓力,也會設(shè)置一定的延時(shí),提升用戶體驗(yàn)。

無論是定時(shí)器還是延時(shí),它們都在 C# 開發(fā)中扮演著不可或缺的角色,幫助開發(fā)者實(shí)現(xiàn)定時(shí)任務(wù)、控制程序執(zhí)行節(jié)奏、優(yōu)化用戶體驗(yàn)等。接下來,就讓我們一同深入探索 C# 定時(shí)器與延時(shí)的奇妙世界,揭開它們神秘的面紗,學(xué)習(xí)如何在實(shí)際項(xiàng)目中巧妙運(yùn)用它們。

C# 定時(shí)器詳解

常見定時(shí)器類介紹

在 C# 的龐大類庫中,為我們提供了多種定時(shí)器類,以滿足不同場景下的定時(shí)需求。其中,較為常見的有 System.Windows.Forms.Timer、System.Threading.Timer 和 System.Timers.Timer,它們各自有著獨(dú)特的特點(diǎn)和適用場景。

  • System.Windows.Forms.Timer:主要應(yīng)用于 Windows 窗體應(yīng)用程序中,它運(yùn)行在 UI 線程上,通過 Tick 事件來觸發(fā)定時(shí)操作。這使得它在更新 UI 元素時(shí)非常便捷,因?yàn)榭梢灾苯釉?Tick 事件處理程序中操作 UI 控件,而無需擔(dān)心線程安全問題。不過,由于它依賴于 Windows 消息循環(huán),所以不適用于控制臺應(yīng)用程序等非 UI 環(huán)境,并且其時(shí)間精度相對較低,大約在 10 - 30 毫秒左右。
  • System.Threading.Timer:基于線程池來工作,是一種輕量級的定時(shí)器。它以回調(diào)的方式實(shí)現(xiàn)定時(shí)任務(wù),具有較高的執(zhí)行效率,適用于對性能要求較高、無需頻繁操作 UI 的后臺任務(wù)場景。它的啟動和停止操作相對靈活,并且可以通過構(gòu)造函數(shù)的參數(shù)來精確控制首次執(zhí)行時(shí)間和執(zhí)行間隔。但需要注意的是,在操作 UI 時(shí),由于它不在 UI 線程上運(yùn)行,所以需要進(jìn)行跨線程操作的處理。
  • System.Timers.Timer:可以在多線程或單線程環(huán)境中使用,通過 Elapsed 事件觸發(fā)定時(shí)操作。它適用于對時(shí)間精度要求較高的場景,并且支持線程同步。在使用時(shí),可以通過設(shè)置 AutoReset 屬性來決定事件觸發(fā)后是否自動重置定時(shí)器,以實(shí)現(xiàn)單次觸發(fā)或循環(huán)觸發(fā)的功能。不過,在操作 UI 時(shí)同樣需要注意跨線程的問題。

System.Windows.Forms.Timer 使用示例

接下來,我們通過一個(gè)簡單的 WinForms 項(xiàng)目來演示 System.Windows.Forms.Timer 的使用。首先,打開 Visual Studio,創(chuàng)建一個(gè)新的 Windows Forms 應(yīng)用程序項(xiàng)目。

在設(shè)計(jì)視圖中,從工具箱中找到 Timer 控件,并將其拖放到窗體上。此時(shí),在窗體下方的組件欄中會出現(xiàn)一個(gè) Timer 圖標(biāo),選中它,在屬性窗口中設(shè)置 Interval 屬性為 1000,表示時(shí)間間隔為 1 秒;設(shè)置 Enabled 屬性為 false,初始狀態(tài)下不啟動定時(shí)器。

然后,雙擊 Timer 控件,自動生成 Tick 事件處理程序。在事件處理程序中,我們可以編寫定時(shí)執(zhí)行的代碼。例如,我們要實(shí)現(xiàn)一個(gè)每秒更新一次 Label 顯示當(dāng)前時(shí)間的功能,代碼如下:

private void timer1_Tick(object sender, EventArgs e)
{
    label1.Text = DateTime.Now.ToString("HH:mm:ss");
}

在上述代碼中,當(dāng) Timer 的 Tick 事件觸發(fā)時(shí),會將當(dāng)前時(shí)間以 “HH:mm:ss” 的格式賦值給 label1 的 Text 屬性,從而實(shí)現(xiàn)每秒更新一次時(shí)間顯示的效果。

最后,我們可以在窗體的 Load 事件或某個(gè)按鈕的 Click 事件中啟動定時(shí)器,例如:

private void Form1_Load(object sender, EventArgs e)
{
    timer1.Enabled = true;
}

這樣,當(dāng)窗體加載完成后,定時(shí)器就會開始工作,每秒觸發(fā)一次 Tick 事件,更新 Label 的顯示內(nèi)容。

System.Threading.Timer 使用示例

System.Threading.Timer 的使用方式與 System.Windows.Forms.Timer 有所不同。下面是一個(gè)簡單的代碼示例,展示如何使用 System.Threading.Timer 來實(shí)現(xiàn)定時(shí)任務(wù):

using System;
using System.Threading;
class Program
{
    private static Timer timer;
    static void Main()
    {
        // 定義回調(diào)函數(shù)
        TimerCallback callback = new TimerCallback(TimerTask);
        // 創(chuàng)建Timer實(shí)例,設(shè)置啟動時(shí)間為0,間隔時(shí)間為1000毫秒(1秒)
        timer = new System.Threading.Timer(callback, null, 0, 1000);
        Console.WriteLine("按任意鍵停止定時(shí)器...");
        Console.ReadKey();
        // 停止定時(shí)器
        timer.Dispose();
        Console.WriteLine("定時(shí)器已停止");
    }
    // 回調(diào)函數(shù)
    private static void TimerTask(object state)
    {
        Console.WriteLine("定時(shí)器回調(diào)執(zhí)行于:" + DateTime.Now);
    }
}

在上述代碼中,首先定義了一個(gè) TimerCallback 類型的回調(diào)函數(shù) TimerTask,該函數(shù)會在定時(shí)器觸發(fā)時(shí)執(zhí)行。然后,通過 Timer 的構(gòu)造函數(shù)創(chuàng)建了一個(gè)定時(shí)器實(shí)例,傳入回調(diào)函數(shù)、狀態(tài)對象(這里為 null)、首次執(zhí)行的延遲時(shí)間(0 毫秒,表示立即執(zhí)行)和執(zhí)行間隔時(shí)間(1000 毫秒)。在 Main 方法中,等待用戶按下任意鍵后,調(diào)用 timer.Dispose () 方法停止并釋放定時(shí)器資源。

需要注意的是,由于 System.Threading.Timer 基于線程池工作,其回調(diào)函數(shù)不在 UI 線程上執(zhí)行,所以在回調(diào)函數(shù)中不能直接操作 UI 控件。如果需要操作 UI,需要使用 Invoke 或 BeginInvoke 方法來切換到 UI 線程。例如,在 WinForms 應(yīng)用中,如果要在回調(diào)函數(shù)中更新 Label 的文本,可以這樣實(shí)現(xiàn):

using System;
using System.Threading;
using System.Windows.Forms;
namespace ThreadingTimerExample
{
    public partial class Form1 : Form
    {
        private static Timer timer;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            // 定義回調(diào)函數(shù)
            TimerCallback callback = new TimerCallback(TimerTask);
            // 創(chuàng)建Timer實(shí)例,設(shè)置啟動時(shí)間為0,間隔時(shí)間為1000毫秒(1秒)
            timer = new System.Threading.Timer(callback, null, 0, 1000);
        }
        // 回調(diào)函數(shù)
        private static void TimerTask(object state)
        {
            Form1 form = (Form1)state;
            form.Invoke((MethodInvoker)delegate
            {
                form.label1.Text = DateTime.Now.ToString("HH:mm:ss");
            });
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // 停止定時(shí)器
            timer.Dispose();
        }
    }
}

在這個(gè)示例中,將 Form1 實(shí)例作為狀態(tài)對象傳遞給定時(shí)器,在回調(diào)函數(shù)中通過 Invoke 方法將更新 Label 文本的操作切換到 UI 線程上執(zhí)行,以確保線程安全。

System.Timers.Timer 使用示例

System.Timers.Timer 的使用方式也有其特點(diǎn),以下是一個(gè)使用 System.Timers.Timer 的示例代碼:

using System;
using System.Timers;

class Program
{
    private static Timer timer;

    static void Main()
    {
        // 創(chuàng)建Timer對象
        timer = new System.Timers.Timer();

        // 設(shè)置間隔時(shí)間為1000毫秒(1秒)
        timer.Interval = 1000;

        // 設(shè)置AutoReset屬性為true,表示事件關(guān)聯(lián)的方法會一直執(zhí)行
        timer.AutoReset = true;

        // 綁定Elapsed事件
        timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);

        // 啟用定時(shí)器
        timer.Enabled = true;

        Console.WriteLine("按Enter鍵退出程序...");
        Console.ReadLine();

        // 停止定時(shí)器
        timer.Stop();
        timer.Dispose();
    }

    // Elapsed事件處理函數(shù)
    private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine("Elapsed事件于 {0:HH:mm:ss.fff} 觸發(fā)", e.SignalTime);
    }
}

在這段代碼中,首先創(chuàng)建了一個(gè) System.Timers.Timer 對象,設(shè)置其 Interval 屬性為 1 秒,AutoReset 屬性為 true,這樣定時(shí)器會在每次到達(dá)時(shí)間間隔時(shí)自動重置并再次觸發(fā) Elapsed 事件。然后,通過 += 運(yùn)算符將 OnTimedEvent 方法綁定到 Elapsed 事件上,當(dāng)事件觸發(fā)時(shí),會執(zhí)行 OnTimedEvent 方法,在控制臺輸出事件觸發(fā)的時(shí)間。最后,在程序結(jié)束時(shí),調(diào)用 timer.Stop () 方法停止定時(shí)器,并調(diào)用 timer.Dispose () 方法釋放資源。

同樣,如果在 WinForms 應(yīng)用中使用 System.Timers.Timer 并需要操作 UI,也需要注意跨線程問題??梢酝ㄟ^設(shè)置 SynchronizingObject 屬性將定時(shí)器的操作同步到 UI 線程上,例如:

using System;
using System.Timers;
using System.Windows.Forms;

namespace TimersTimerExample
{
    public partial class Form1 : Form
    {
        private System.Timers.Timer timer;

        public Form1()
        {
            InitializeComponent();

            // 創(chuàng)建Timer對象
            timer = new System.Timers.Timer();

            // 設(shè)置間隔時(shí)間為1000毫秒(1秒)
            timer.Interval = 1000;

            // 設(shè)置AutoReset屬性為true,表示事件關(guān)聯(lián)的方法會一直執(zhí)行
            timer.AutoReset = true;

            // 綁定Elapsed事件
            timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);

            // 將定時(shí)器的操作同步到UI線程
            timer.SynchronizingObject = this;

            // 啟用定時(shí)器
            timer.Enabled = true;
        }

        // Elapsed事件處理函數(shù)
        private void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
        {
            label1.Text = DateTime.Now.ToString("HH:mm:ss");
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            // 停止定時(shí)器
            timer.Stop();
            timer.Dispose();
        }
    }
}

在這個(gè)示例中,通過設(shè)置 timer.SynchronizingObject = this,將定時(shí)器的操作同步到當(dāng)前窗體的 UI 線程上,這樣在 Elapsed 事件處理函數(shù)中就可以直接操作 UI 控件,而無需額外的跨線程處理。

定時(shí)器應(yīng)用場景舉例

在實(shí)際項(xiàng)目開發(fā)中,定時(shí)器有著廣泛的應(yīng)用場景,以下是一些常見的例子:

  • 定時(shí)數(shù)據(jù)備份:在數(shù)據(jù)庫管理系統(tǒng)中,為了保證數(shù)據(jù)的安全性和完整性,常常需要定時(shí)對數(shù)據(jù)庫進(jìn)行備份操作。通過使用定時(shí)器,可以設(shè)置每天、每周或每月的特定時(shí)間點(diǎn)自動執(zhí)行備份任務(wù),將數(shù)據(jù)庫中的數(shù)據(jù)復(fù)制到安全的存儲位置,以防止數(shù)據(jù)丟失或損壞。例如,在一個(gè)企業(yè)級的財(cái)務(wù)管理系統(tǒng)中,每天凌晨 2 點(diǎn)定時(shí)備份財(cái)務(wù)數(shù)據(jù),確保數(shù)據(jù)的實(shí)時(shí)性和可恢復(fù)性。
  • 輪詢服務(wù)狀態(tài):在分布式系統(tǒng)中,各個(gè)服務(wù)之間相互協(xié)作,為了確保系統(tǒng)的穩(wěn)定性和可靠性,需要實(shí)時(shí)監(jiān)控各個(gè)服務(wù)的運(yùn)行狀態(tài)。定時(shí)器可以定時(shí)向各個(gè)服務(wù)發(fā)送心跳請求,檢測服務(wù)是否正常響應(yīng)。如果某個(gè)服務(wù)在規(guī)定時(shí)間內(nèi)沒有響應(yīng),系統(tǒng)可以及時(shí)發(fā)出警報(bào),并采取相應(yīng)的措施,如自動重啟服務(wù)或進(jìn)行故障轉(zhuǎn)移。比如,在一個(gè)電商平臺的微服務(wù)架構(gòu)中,定時(shí)輪詢訂單服務(wù)、支付服務(wù)等的狀態(tài),確保用戶的購物流程不受影響。
  • 定時(shí)更新緩存:在 Web 應(yīng)用程序中,為了提高數(shù)據(jù)的訪問速度,常常使用緩存技術(shù)。然而,緩存中的數(shù)據(jù)需要與數(shù)據(jù)庫中的實(shí)時(shí)數(shù)據(jù)保持一致,因此需要定時(shí)更新緩存。定時(shí)器可以按照設(shè)定的時(shí)間間隔,從數(shù)據(jù)庫中獲取最新的數(shù)據(jù),并更新到緩存中,以保證用戶獲取到的數(shù)據(jù)是最新的。例如,在一個(gè)新聞資訊網(wǎng)站中,每 10 分鐘定時(shí)更新緩存中的熱門新聞列表,為用戶提供最新的新聞內(nèi)容。
  • 自動化任務(wù)調(diào)度:在一些需要定期執(zhí)行的任務(wù)中,如生成報(bào)表、發(fā)送郵件、清理臨時(shí)文件等,定時(shí)器可以發(fā)揮重要作用。通過設(shè)置定時(shí)器的觸發(fā)時(shí)間和執(zhí)行間隔,實(shí)現(xiàn)任務(wù)的自動化調(diào)度,減少人工干預(yù),提高工作效率。比如,在一個(gè)企業(yè)的辦公自動化系統(tǒng)中,每周一早上 9 點(diǎn)定時(shí)生成上周的工作報(bào)表,并自動發(fā)送給相關(guān)部門的負(fù)責(zé)人。

C# 延時(shí)實(shí)現(xiàn)方式

Thread.Sleep 方法

在 C# 中,Thread.Sleep方法是一種簡單直接的實(shí)現(xiàn)延時(shí)的方式。它的作用是使當(dāng)前線程暫停執(zhí)行指定的時(shí)間,參數(shù)為毫秒數(shù)。例如,Thread.Sleep(1000)表示讓當(dāng)前線程休眠 1000 毫秒,即 1 秒。

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Console.WriteLine("開始延時(shí)...");
        Thread.Sleep(3000); // 延時(shí)3秒
        Console.WriteLine("延時(shí)結(jié)束");
    }
}

上述代碼中,當(dāng)執(zhí)行到Thread.Sleep(3000)時(shí),主線程會被阻塞,暫停執(zhí)行 3 秒,在此期間,線程不會執(zhí)行任何其他操作,3 秒后線程才會恢復(fù)執(zhí)行后續(xù)代碼。然而,由于Thread.Sleep會阻塞當(dāng)前線程,如果在 UI 線程中使用,會導(dǎo)致界面無響應(yīng),出現(xiàn)卡頓甚至假死的情況,所以它不適合在需要保持界面交互性的 UI 線程中使用。但在一些簡單的控制臺應(yīng)用程序、測試代碼或者對線程執(zhí)行順序有嚴(yán)格要求且不需要線程在延時(shí)期間執(zhí)行其他任務(wù)的場景中,Thread.Sleep方法還是非常實(shí)用的。

Task.Delay 方法

Task.Delay方法是基于異步編程模型的延時(shí)實(shí)現(xiàn)方式,它具有異步特性,不會阻塞當(dāng)前線程。Task.Delay方法返回一個(gè)Task對象,表示在指定的時(shí)間間隔后完成的異步操作。通常,它會配合async/await關(guān)鍵字一起使用,以實(shí)現(xiàn)異步延時(shí)的效果。

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine("開始異步延時(shí)...");
        await Task.Delay(2000); // 異步延時(shí)2秒
        Console.WriteLine("異步延時(shí)結(jié)束");
    }
}

在上述代碼中,await Task.Delay(2000)會啟動一個(gè)異步任務(wù),該任務(wù)會在 2 秒后完成。當(dāng)執(zhí)行到這一行代碼時(shí),方法會暫停執(zhí)行,但當(dāng)前線程不會被阻塞,而是將控制權(quán)返回給調(diào)用者,調(diào)用者可以繼續(xù)執(zhí)行其他任務(wù)。2 秒后,Task.Delay任務(wù)完成,程序從await之后的代碼繼續(xù)執(zhí)行。

在 UI 應(yīng)用中,Task.Delay的優(yōu)勢尤為明顯。例如,在一個(gè) WinForms 應(yīng)用程序中,當(dāng)用戶點(diǎn)擊按鈕時(shí),如果使用Thread.Sleep進(jìn)行延時(shí)操作,界面會在延時(shí)期間凍結(jié),無法響應(yīng)用戶的任何操作;而使用Task.Delay,界面則可以保持響應(yīng),用戶可以繼續(xù)進(jìn)行其他交互,極大地提升了用戶體驗(yàn)。此外,在需要處理高并發(fā)的服務(wù)器應(yīng)用或者其他異步操作場景中,Task.Delay也能充分發(fā)揮其非阻塞的優(yōu)勢,提高系統(tǒng)資源的利用率和程序的整體性能。

使用 Timer 實(shí)現(xiàn)延時(shí)

除了上述兩種方式,還可以利用定時(shí)器來實(shí)現(xiàn)延時(shí)效果。以System.Timers.Timer為例,通過設(shè)置其Interval屬性和AutoReset屬性,可以實(shí)現(xiàn)單次觸發(fā)的延時(shí)操作。

using System;
using System.Timers;

class Program
{
    private static Timer timer;

    static void Main()
    {
        // 創(chuàng)建Timer對象
        timer = new System.Timers.Timer();

        // 設(shè)置間隔時(shí)間為3000毫秒(3秒)
        timer.Interval = 3000;

        // 設(shè)置AutoReset屬性為false,表示只執(zhí)行一次
        timer.AutoReset = false;

        // 綁定Elapsed事件
        timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);

        // 啟用定時(shí)器
        timer.Enabled = true;

        Console.WriteLine("啟動定時(shí)器,開始延時(shí)...");

        Console.WriteLine("按Enter鍵退出程序...");
        Console.ReadLine();

        // 停止定時(shí)器
        timer.Stop();
        timer.Dispose();
    }

    // Elapsed事件處理函數(shù)
    private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
    {
        Console.WriteLine("延時(shí)結(jié)束,定時(shí)器觸發(fā)于:" + e.SignalTime);
    }
}

在這段代碼中,創(chuàng)建了一個(gè)System.Timers.Timer對象,設(shè)置其Interval為 3 秒,AutoResetfalse,這樣定時(shí)器只會觸發(fā)一次。當(dāng)定時(shí)器啟動后,經(jīng)過 3 秒,會觸發(fā)Elapsed事件,執(zhí)行OnTimedEvent方法中的代碼,實(shí)現(xiàn)了延時(shí) 3 秒后執(zhí)行特定操作的效果。

各種延時(shí)方法對比與選擇

從是否阻塞線程的角度來看,Thread.Sleep會阻塞當(dāng)前線程,在延時(shí)期間線程無法執(zhí)行其他任務(wù);而Task.Delay和利用定時(shí)器實(shí)現(xiàn)的延時(shí)不會阻塞線程,線程可以在延時(shí)期間繼續(xù)執(zhí)行其他操作。

在是否適用于 UI 方面,Thread.Sleep不適合在 UI 線程中使用,否則會導(dǎo)致界面卡頓;Task.Delay則非常適合在 UI 應(yīng)用中實(shí)現(xiàn)延時(shí)操作,能夠保持界面的響應(yīng)性;使用定時(shí)器實(shí)現(xiàn)延時(shí),如果需要操作 UI,需要注意跨線程問題,可通過設(shè)置SynchronizingObject屬性等方式來確保線程安全。

在選擇延時(shí)方法時(shí),如果是簡單的控制臺應(yīng)用程序,對線程執(zhí)行順序有嚴(yán)格要求,且不需要線程在延時(shí)期間執(zhí)行其他任務(wù),可以選擇Thread.Sleep;如果是在 UI 應(yīng)用程序或者需要處理高并發(fā)的異步操作場景中,為了保持界面響應(yīng)性或提高系統(tǒng)資源利用率,應(yīng)優(yōu)先選擇Task.Delay;如果需要實(shí)現(xiàn)更復(fù)雜的定時(shí)任務(wù),包括循環(huán)觸發(fā)或單次觸發(fā)等,可以考慮使用定時(shí)器來實(shí)現(xiàn)延時(shí)效果。

實(shí)戰(zhàn)案例:打造定時(shí)數(shù)據(jù)采集程序

需求分析

在實(shí)際的項(xiàng)目開發(fā)中,定時(shí)采集數(shù)據(jù)并存儲是一個(gè)非常常見的需求。例如,在工業(yè)自動化領(lǐng)域,我們需要定時(shí)采集各種傳感器的數(shù)據(jù),以便對生產(chǎn)過程進(jìn)行實(shí)時(shí)監(jiān)控和分析;在物聯(lián)網(wǎng)項(xiàng)目中,需要定時(shí)從各種智能設(shè)備中采集數(shù)據(jù),用于數(shù)據(jù)分析和業(yè)務(wù)決策。

本案例的目標(biāo)是實(shí)現(xiàn)一個(gè)定時(shí)數(shù)據(jù)采集程序,能夠按照設(shè)定的時(shí)間間隔從指定的數(shù)據(jù)源采集數(shù)據(jù),并將采集到的數(shù)據(jù)存儲到本地文件或數(shù)據(jù)庫中,為后續(xù)的數(shù)據(jù)分析和處理提供基礎(chǔ)。

技術(shù)選型

為了實(shí)現(xiàn)這個(gè)定時(shí)數(shù)據(jù)采集程序,我們可以選擇使用System.Threading.Timer來實(shí)現(xiàn)定時(shí)任務(wù),因?yàn)樗诰€程池工作,具有較高的執(zhí)行效率,適合在后臺長時(shí)間運(yùn)行的任務(wù)。同時(shí),使用Task.Delay來實(shí)現(xiàn)一些簡單的延時(shí)操作,以滿足在數(shù)據(jù)采集過程中的一些特殊時(shí)間控制需求。

在數(shù)據(jù)存儲方面,我們可以選擇使用文件系統(tǒng)來存儲數(shù)據(jù),將采集到的數(shù)據(jù)以文本文件的形式保存到本地磁盤,這種方式簡單直觀,適合數(shù)據(jù)量較小的場景;如果數(shù)據(jù)量較大或?qū)?shù)據(jù)管理和查詢有更高的要求,也可以選擇使用數(shù)據(jù)庫,如 SQLite、MySQL 等,這里我們先以文件存儲為例進(jìn)行演示。

代碼實(shí)現(xiàn)

下面是一個(gè)使用System.Threading.Timer實(shí)現(xiàn)定時(shí)數(shù)據(jù)采集并存儲到文件的示例代碼:

using System;
using System.IO;
using System.Threading;

class DataCollector
{
    private static Timer timer;
    private static string filePath = "data.txt";

    static void Main()
    {
        // 定義回調(diào)函數(shù)
        TimerCallback callback = new TimerCallback(CollectData);

        // 創(chuàng)建Timer實(shí)例,設(shè)置啟動時(shí)間為0,間隔時(shí)間為5000毫秒(5秒)
        timer = new System.Threading.Timer(callback, null, 0, 5000);

        Console.WriteLine("數(shù)據(jù)采集程序已啟動,按任意鍵停止...");
        Console.ReadKey();

        // 停止定時(shí)器
        timer.Dispose();
        Console.WriteLine("數(shù)據(jù)采集程序已停止");
    }

    // 回調(diào)函數(shù),用于采集數(shù)據(jù)并存儲
    private static void CollectData(object state)
    {
        // 模擬數(shù)據(jù)采集,這里使用當(dāng)前時(shí)間作為采集數(shù)據(jù)
        string data = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

        // 將數(shù)據(jù)存儲到文件中
        using (StreamWriter sw = File.AppendText(filePath))
        {
            sw.WriteLine(data);
        }

        Console.WriteLine($"采集到數(shù)據(jù):{data} 并已存儲到文件");
    }
}

在上述代碼中,首先在Main方法中創(chuàng)建了一個(gè)System.Threading.Timer實(shí)例,設(shè)置其回調(diào)函數(shù)為CollectData,首次執(zhí)行時(shí)間為 0(即立即執(zhí)行),執(zhí)行間隔為 5 秒。在CollectData回調(diào)函數(shù)中,模擬采集數(shù)據(jù)(這里使用當(dāng)前時(shí)間作為數(shù)據(jù)),并將數(shù)據(jù)追加寫入到名為data.txt的文件中。

到此這篇關(guān)于C#定時(shí)器與延時(shí)操作的使用的文章就介紹到這了,更多相關(guān)C#定時(shí)器與延時(shí)操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • unity shader 較完整光照(含有多光源陰影)

    unity shader 較完整光照(含有多光源陰影)

    這篇文章主要介紹了unity shader 較完整光照(含有多光源陰影),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù)

    C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù)

    這篇文章主要介紹了C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下
    2021-02-02
  • c# 使用Task實(shí)現(xiàn)非阻塞式的I/O操作

    c# 使用Task實(shí)現(xiàn)非阻塞式的I/O操作

    這篇文章主要介紹了c# 使用Task實(shí)現(xiàn)非阻塞式的I/O操作,幫助大家更好的理解和學(xué)習(xí)c# 編程語言,感興趣的朋友可以了解下
    2020-11-11
  • C#提取PDF表單數(shù)據(jù)的實(shí)現(xiàn)流程

    C#提取PDF表單數(shù)據(jù)的實(shí)現(xiàn)流程

    PDF表單是一種常見的數(shù)據(jù)收集工具,廣泛應(yīng)用于調(diào)查問卷、業(yè)務(wù)合同等場景,憑借出色的跨平臺兼容性和標(biāo)準(zhǔn)化特點(diǎn),PDF表單在各行各業(yè)中得到了廣泛應(yīng)用,本文將探討如何使用C# 實(shí)現(xiàn)自動化PDF表單數(shù)據(jù)提取流程,需要的朋友可以參考下
    2025-01-01
  • C#通過經(jīng)緯度計(jì)算2個(gè)點(diǎn)之間距離的實(shí)現(xiàn)代碼

    C#通過經(jīng)緯度計(jì)算2個(gè)點(diǎn)之間距離的實(shí)現(xiàn)代碼

    這篇文章主要介紹了C#通過經(jīng)緯度計(jì)算2個(gè)點(diǎn)之間距離實(shí)現(xiàn)代碼,本文對實(shí)現(xiàn)原理、經(jīng)緯度基本知識等一并做了講解,需要的朋友可以參考下
    2014-08-08
  • C#?線程切換后上下文都去了哪里(.NET高級調(diào)試分析)

    C#?線程切換后上下文都去了哪里(.NET高級調(diào)試分析)

    總會有一些朋友問一個(gè)問題,在 Windows 中線程做了上下文切換,請問被切的線程他的寄存器上下文都去了哪里?這個(gè)問題其實(shí)比較底層,如果對操作系統(tǒng)沒有個(gè)體系層面的理解以及做過源碼分析,其實(shí)很難說明白,這篇我們就從.NET高級調(diào)試的角度分析,需要的朋友可以參考下
    2023-12-12
  • C#算法之實(shí)現(xiàn)阿姆斯特朗數(shù)

    C#算法之實(shí)現(xiàn)阿姆斯特朗數(shù)

    這篇文章介紹了C#實(shí)現(xiàn)阿姆斯特朗數(shù)的算法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-02-02
  • C#中Dictionary類使用實(shí)例

    C#中Dictionary類使用實(shí)例

    這篇文章主要介紹了C#中Dictionary類使用實(shí)例,本文直接給出一個(gè)使用實(shí)例,包含一些Dictionary的基本用法,需要的朋友可以參考下
    2015-06-06
  • C#檢測移動硬盤并獲取移動硬盤盤符的方法

    C#檢測移動硬盤并獲取移動硬盤盤符的方法

    這篇文章主要介紹了利用C#檢測移動硬盤并獲取移動硬盤盤符
    2017-12-12
  • C#實(shí)現(xiàn)備忘錄功能

    C#實(shí)現(xiàn)備忘錄功能

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)備忘錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11

最新評論

湟源县| 资兴市| 普洱| 罗城| 田东县| 玛曲县| 淮北市| 新龙县| 容城县| 平顺县| 七台河市| 建瓯市| 临颍县| 米林县| 连平县| 阿瓦提县| 保靖县| 寿宁县| 乌海市| 彩票| 杭锦后旗| 彭山县| 句容市| 厦门市| 定边县| 晋江市| 武山县| 台安县| 姚安县| 青岛市| 高台县| 东丰县| 田阳县| 黔西| 海门市| 夹江县| 望奎县| 万州区| 葫芦岛市| 辰溪县| 册亨县|