C#定時器與延時操作的使用
引言
在 C# 開發(fā)的廣袤領(lǐng)域中,定時器與延時機制宛如隱匿在幕后的精密齒輪,悄無聲息卻又至關(guān)重要地推動著程序的高效運轉(zhuǎn)。它們是構(gòu)建復(fù)雜邏輯和實現(xiàn)特定功能的基石,為開發(fā)者提供了對程序執(zhí)行時間的精準把控。
定時器,如同一位不知疲倦的時間管家,按照預(yù)設(shè)的時間間隔準時觸發(fā)事件,執(zhí)行特定的代碼塊。在數(shù)據(jù)處理中,我們常常需要定時從數(shù)據(jù)庫中獲取最新數(shù)據(jù),進行實時分析與展示;在網(wǎng)絡(luò)通信中,定時發(fā)送心跳包以維持連接的穩(wěn)定性,確保信息的順暢傳輸。這些場景都離不開定時器的助力,它讓程序能夠有條不紊地按照既定節(jié)奏工作,實現(xiàn)各種自動化任務(wù)。
而延時,則像是為程序執(zhí)行流程按下了 “暫停鍵”,讓特定的操作在經(jīng)過一段指定的時間后再執(zhí)行。當我們啟動一個程序時,可能需要延時片刻,等待系統(tǒng)資源的初始化和加載,確保程序后續(xù)的穩(wěn)定運行;在用戶交互過程中,為了避免頻繁操作導(dǎo)致的系統(tǒng)壓力,也會設(shè)置一定的延時,提升用戶體驗。
無論是定時器還是延時,它們都在 C# 開發(fā)中扮演著不可或缺的角色,幫助開發(fā)者實現(xiàn)定時任務(wù)、控制程序執(zhí)行節(jié)奏、優(yōu)化用戶體驗等。接下來,就讓我們一同深入探索 C# 定時器與延時的奇妙世界,揭開它們神秘的面紗,學(xué)習(xí)如何在實際項目中巧妙運用它們。
C# 定時器詳解
常見定時器類介紹
在 C# 的龐大類庫中,為我們提供了多種定時器類,以滿足不同場景下的定時需求。其中,較為常見的有 System.Windows.Forms.Timer、System.Threading.Timer 和 System.Timers.Timer,它們各自有著獨特的特點和適用場景。
- System.Windows.Forms.Timer:主要應(yīng)用于 Windows 窗體應(yīng)用程序中,它運行在 UI 線程上,通過 Tick 事件來觸發(fā)定時操作。這使得它在更新 UI 元素時非常便捷,因為可以直接在 Tick 事件處理程序中操作 UI 控件,而無需擔(dān)心線程安全問題。不過,由于它依賴于 Windows 消息循環(huán),所以不適用于控制臺應(yīng)用程序等非 UI 環(huán)境,并且其時間精度相對較低,大約在 10 - 30 毫秒左右。
- System.Threading.Timer:基于線程池來工作,是一種輕量級的定時器。它以回調(diào)的方式實現(xiàn)定時任務(wù),具有較高的執(zhí)行效率,適用于對性能要求較高、無需頻繁操作 UI 的后臺任務(wù)場景。它的啟動和停止操作相對靈活,并且可以通過構(gòu)造函數(shù)的參數(shù)來精確控制首次執(zhí)行時間和執(zhí)行間隔。但需要注意的是,在操作 UI 時,由于它不在 UI 線程上運行,所以需要進行跨線程操作的處理。
- System.Timers.Timer:可以在多線程或單線程環(huán)境中使用,通過 Elapsed 事件觸發(fā)定時操作。它適用于對時間精度要求較高的場景,并且支持線程同步。在使用時,可以通過設(shè)置 AutoReset 屬性來決定事件觸發(fā)后是否自動重置定時器,以實現(xiàn)單次觸發(fā)或循環(huán)觸發(fā)的功能。不過,在操作 UI 時同樣需要注意跨線程的問題。
System.Windows.Forms.Timer 使用示例
接下來,我們通過一個簡單的 WinForms 項目來演示 System.Windows.Forms.Timer 的使用。首先,打開 Visual Studio,創(chuàng)建一個新的 Windows Forms 應(yīng)用程序項目。
在設(shè)計視圖中,從工具箱中找到 Timer 控件,并將其拖放到窗體上。此時,在窗體下方的組件欄中會出現(xiàn)一個 Timer 圖標,選中它,在屬性窗口中設(shè)置 Interval 屬性為 1000,表示時間間隔為 1 秒;設(shè)置 Enabled 屬性為 false,初始狀態(tài)下不啟動定時器。
然后,雙擊 Timer 控件,自動生成 Tick 事件處理程序。在事件處理程序中,我們可以編寫定時執(zhí)行的代碼。例如,我們要實現(xiàn)一個每秒更新一次 Label 顯示當前時間的功能,代碼如下:
private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = DateTime.Now.ToString("HH:mm:ss");
}
在上述代碼中,當 Timer 的 Tick 事件觸發(fā)時,會將當前時間以 “HH:mm:ss” 的格式賦值給 label1 的 Text 屬性,從而實現(xiàn)每秒更新一次時間顯示的效果。
最后,我們可以在窗體的 Load 事件或某個按鈕的 Click 事件中啟動定時器,例如:
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
}
這樣,當窗體加載完成后,定時器就會開始工作,每秒觸發(fā)一次 Tick 事件,更新 Label 的顯示內(nèi)容。
System.Threading.Timer 使用示例
System.Threading.Timer 的使用方式與 System.Windows.Forms.Timer 有所不同。下面是一個簡單的代碼示例,展示如何使用 System.Threading.Timer 來實現(xiàn)定時任務(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è)置啟動時間為0,間隔時間為1000毫秒(1秒)
timer = new System.Threading.Timer(callback, null, 0, 1000);
Console.WriteLine("按任意鍵停止定時器...");
Console.ReadKey();
// 停止定時器
timer.Dispose();
Console.WriteLine("定時器已停止");
}
// 回調(diào)函數(shù)
private static void TimerTask(object state)
{
Console.WriteLine("定時器回調(diào)執(zhí)行于:" + DateTime.Now);
}
}在上述代碼中,首先定義了一個 TimerCallback 類型的回調(diào)函數(shù) TimerTask,該函數(shù)會在定時器觸發(fā)時執(zhí)行。然后,通過 Timer 的構(gòu)造函數(shù)創(chuàng)建了一個定時器實例,傳入回調(diào)函數(shù)、狀態(tài)對象(這里為 null)、首次執(zhí)行的延遲時間(0 毫秒,表示立即執(zhí)行)和執(zhí)行間隔時間(1000 毫秒)。在 Main 方法中,等待用戶按下任意鍵后,調(diào)用 timer.Dispose () 方法停止并釋放定時器資源。
需要注意的是,由于 System.Threading.Timer 基于線程池工作,其回調(diào)函數(shù)不在 UI 線程上執(zhí)行,所以在回調(diào)函數(shù)中不能直接操作 UI 控件。如果需要操作 UI,需要使用 Invoke 或 BeginInvoke 方法來切換到 UI 線程。例如,在 WinForms 應(yīng)用中,如果要在回調(diào)函數(shù)中更新 Label 的文本,可以這樣實現(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è)置啟動時間為0,間隔時間為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)
{
// 停止定時器
timer.Dispose();
}
}
}在這個示例中,將 Form1 實例作為狀態(tài)對象傳遞給定時器,在回調(diào)函數(shù)中通過 Invoke 方法將更新 Label 文本的操作切換到 UI 線程上執(zhí)行,以確保線程安全。
System.Timers.Timer 使用示例
System.Timers.Timer 的使用方式也有其特點,以下是一個使用 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è)置間隔時間為1000毫秒(1秒)
timer.Interval = 1000;
// 設(shè)置AutoReset屬性為true,表示事件關(guān)聯(lián)的方法會一直執(zhí)行
timer.AutoReset = true;
// 綁定Elapsed事件
timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
// 啟用定時器
timer.Enabled = true;
Console.WriteLine("按Enter鍵退出程序...");
Console.ReadLine();
// 停止定時器
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)建了一個 System.Timers.Timer 對象,設(shè)置其 Interval 屬性為 1 秒,AutoReset 屬性為 true,這樣定時器會在每次到達時間間隔時自動重置并再次觸發(fā) Elapsed 事件。然后,通過 += 運算符將 OnTimedEvent 方法綁定到 Elapsed 事件上,當事件觸發(fā)時,會執(zhí)行 OnTimedEvent 方法,在控制臺輸出事件觸發(fā)的時間。最后,在程序結(jié)束時,調(diào)用 timer.Stop () 方法停止定時器,并調(diào)用 timer.Dispose () 方法釋放資源。
同樣,如果在 WinForms 應(yīng)用中使用 System.Timers.Timer 并需要操作 UI,也需要注意跨線程問題??梢酝ㄟ^設(shè)置 SynchronizingObject 屬性將定時器的操作同步到 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è)置間隔時間為1000毫秒(1秒)
timer.Interval = 1000;
// 設(shè)置AutoReset屬性為true,表示事件關(guān)聯(lián)的方法會一直執(zhí)行
timer.AutoReset = true;
// 綁定Elapsed事件
timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
// 將定時器的操作同步到UI線程
timer.SynchronizingObject = this;
// 啟用定時器
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)
{
// 停止定時器
timer.Stop();
timer.Dispose();
}
}
}
在這個示例中,通過設(shè)置 timer.SynchronizingObject = this,將定時器的操作同步到當前窗體的 UI 線程上,這樣在 Elapsed 事件處理函數(shù)中就可以直接操作 UI 控件,而無需額外的跨線程處理。
定時器應(yīng)用場景舉例
在實際項目開發(fā)中,定時器有著廣泛的應(yīng)用場景,以下是一些常見的例子:
- 定時數(shù)據(jù)備份:在數(shù)據(jù)庫管理系統(tǒng)中,為了保證數(shù)據(jù)的安全性和完整性,常常需要定時對數(shù)據(jù)庫進行備份操作。通過使用定時器,可以設(shè)置每天、每周或每月的特定時間點自動執(zhí)行備份任務(wù),將數(shù)據(jù)庫中的數(shù)據(jù)復(fù)制到安全的存儲位置,以防止數(shù)據(jù)丟失或損壞。例如,在一個企業(yè)級的財務(wù)管理系統(tǒng)中,每天凌晨 2 點定時備份財務(wù)數(shù)據(jù),確保數(shù)據(jù)的實時性和可恢復(fù)性。
- 輪詢服務(wù)狀態(tài):在分布式系統(tǒng)中,各個服務(wù)之間相互協(xié)作,為了確保系統(tǒng)的穩(wěn)定性和可靠性,需要實時監(jiān)控各個服務(wù)的運行狀態(tài)。定時器可以定時向各個服務(wù)發(fā)送心跳請求,檢測服務(wù)是否正常響應(yīng)。如果某個服務(wù)在規(guī)定時間內(nèi)沒有響應(yīng),系統(tǒng)可以及時發(fā)出警報,并采取相應(yīng)的措施,如自動重啟服務(wù)或進行故障轉(zhuǎn)移。比如,在一個電商平臺的微服務(wù)架構(gòu)中,定時輪詢訂單服務(wù)、支付服務(wù)等的狀態(tài),確保用戶的購物流程不受影響。
- 定時更新緩存:在 Web 應(yīng)用程序中,為了提高數(shù)據(jù)的訪問速度,常常使用緩存技術(shù)。然而,緩存中的數(shù)據(jù)需要與數(shù)據(jù)庫中的實時數(shù)據(jù)保持一致,因此需要定時更新緩存。定時器可以按照設(shè)定的時間間隔,從數(shù)據(jù)庫中獲取最新的數(shù)據(jù),并更新到緩存中,以保證用戶獲取到的數(shù)據(jù)是最新的。例如,在一個新聞資訊網(wǎng)站中,每 10 分鐘定時更新緩存中的熱門新聞列表,為用戶提供最新的新聞內(nèi)容。
- 自動化任務(wù)調(diào)度:在一些需要定期執(zhí)行的任務(wù)中,如生成報表、發(fā)送郵件、清理臨時文件等,定時器可以發(fā)揮重要作用。通過設(shè)置定時器的觸發(fā)時間和執(zhí)行間隔,實現(xiàn)任務(wù)的自動化調(diào)度,減少人工干預(yù),提高工作效率。比如,在一個企業(yè)的辦公自動化系統(tǒng)中,每周一早上 9 點定時生成上周的工作報表,并自動發(fā)送給相關(guān)部門的負責(zé)人。
C# 延時實現(xiàn)方式
Thread.Sleep 方法
在 C# 中,Thread.Sleep方法是一種簡單直接的實現(xiàn)延時的方式。它的作用是使當前線程暫停執(zhí)行指定的時間,參數(shù)為毫秒數(shù)。例如,Thread.Sleep(1000)表示讓當前線程休眠 1000 毫秒,即 1 秒。
using System;
using System.Threading;
class Program
{
static void Main()
{
Console.WriteLine("開始延時...");
Thread.Sleep(3000); // 延時3秒
Console.WriteLine("延時結(jié)束");
}
}
上述代碼中,當執(zhí)行到Thread.Sleep(3000)時,主線程會被阻塞,暫停執(zhí)行 3 秒,在此期間,線程不會執(zhí)行任何其他操作,3 秒后線程才會恢復(fù)執(zhí)行后續(xù)代碼。然而,由于Thread.Sleep會阻塞當前線程,如果在 UI 線程中使用,會導(dǎo)致界面無響應(yīng),出現(xiàn)卡頓甚至假死的情況,所以它不適合在需要保持界面交互性的 UI 線程中使用。但在一些簡單的控制臺應(yīng)用程序、測試代碼或者對線程執(zhí)行順序有嚴格要求且不需要線程在延時期間執(zhí)行其他任務(wù)的場景中,Thread.Sleep方法還是非常實用的。
Task.Delay 方法
Task.Delay方法是基于異步編程模型的延時實現(xiàn)方式,它具有異步特性,不會阻塞當前線程。Task.Delay方法返回一個Task對象,表示在指定的時間間隔后完成的異步操作。通常,它會配合async/await關(guān)鍵字一起使用,以實現(xiàn)異步延時的效果。
using System;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
Console.WriteLine("開始異步延時...");
await Task.Delay(2000); // 異步延時2秒
Console.WriteLine("異步延時結(jié)束");
}
}
在上述代碼中,await Task.Delay(2000)會啟動一個異步任務(wù),該任務(wù)會在 2 秒后完成。當執(zhí)行到這一行代碼時,方法會暫停執(zhí)行,但當前線程不會被阻塞,而是將控制權(quán)返回給調(diào)用者,調(diào)用者可以繼續(xù)執(zhí)行其他任務(wù)。2 秒后,Task.Delay任務(wù)完成,程序從await之后的代碼繼續(xù)執(zhí)行。
在 UI 應(yīng)用中,Task.Delay的優(yōu)勢尤為明顯。例如,在一個 WinForms 應(yīng)用程序中,當用戶點擊按鈕時,如果使用Thread.Sleep進行延時操作,界面會在延時期間凍結(jié),無法響應(yīng)用戶的任何操作;而使用Task.Delay,界面則可以保持響應(yīng),用戶可以繼續(xù)進行其他交互,極大地提升了用戶體驗。此外,在需要處理高并發(fā)的服務(wù)器應(yīng)用或者其他異步操作場景中,Task.Delay也能充分發(fā)揮其非阻塞的優(yōu)勢,提高系統(tǒng)資源的利用率和程序的整體性能。
使用 Timer 實現(xiàn)延時
除了上述兩種方式,還可以利用定時器來實現(xiàn)延時效果。以System.Timers.Timer為例,通過設(shè)置其Interval屬性和AutoReset屬性,可以實現(xiàn)單次觸發(fā)的延時操作。
using System;
using System.Timers;
class Program
{
private static Timer timer;
static void Main()
{
// 創(chuàng)建Timer對象
timer = new System.Timers.Timer();
// 設(shè)置間隔時間為3000毫秒(3秒)
timer.Interval = 3000;
// 設(shè)置AutoReset屬性為false,表示只執(zhí)行一次
timer.AutoReset = false;
// 綁定Elapsed事件
timer.Elapsed += new System.Timers.ElapsedEventHandler(OnTimedEvent);
// 啟用定時器
timer.Enabled = true;
Console.WriteLine("啟動定時器,開始延時...");
Console.WriteLine("按Enter鍵退出程序...");
Console.ReadLine();
// 停止定時器
timer.Stop();
timer.Dispose();
}
// Elapsed事件處理函數(shù)
private static void OnTimedEvent(object source, System.Timers.ElapsedEventArgs e)
{
Console.WriteLine("延時結(jié)束,定時器觸發(fā)于:" + e.SignalTime);
}
}
在這段代碼中,創(chuàng)建了一個System.Timers.Timer對象,設(shè)置其Interval為 3 秒,AutoReset為false,這樣定時器只會觸發(fā)一次。當定時器啟動后,經(jīng)過 3 秒,會觸發(fā)Elapsed事件,執(zhí)行OnTimedEvent方法中的代碼,實現(xiàn)了延時 3 秒后執(zhí)行特定操作的效果。
各種延時方法對比與選擇
從是否阻塞線程的角度來看,Thread.Sleep會阻塞當前線程,在延時期間線程無法執(zhí)行其他任務(wù);而Task.Delay和利用定時器實現(xiàn)的延時不會阻塞線程,線程可以在延時期間繼續(xù)執(zhí)行其他操作。
在是否適用于 UI 方面,Thread.Sleep不適合在 UI 線程中使用,否則會導(dǎo)致界面卡頓;Task.Delay則非常適合在 UI 應(yīng)用中實現(xiàn)延時操作,能夠保持界面的響應(yīng)性;使用定時器實現(xiàn)延時,如果需要操作 UI,需要注意跨線程問題,可通過設(shè)置SynchronizingObject屬性等方式來確保線程安全。
在選擇延時方法時,如果是簡單的控制臺應(yīng)用程序,對線程執(zhí)行順序有嚴格要求,且不需要線程在延時期間執(zhí)行其他任務(wù),可以選擇Thread.Sleep;如果是在 UI 應(yīng)用程序或者需要處理高并發(fā)的異步操作場景中,為了保持界面響應(yīng)性或提高系統(tǒng)資源利用率,應(yīng)優(yōu)先選擇Task.Delay;如果需要實現(xiàn)更復(fù)雜的定時任務(wù),包括循環(huán)觸發(fā)或單次觸發(fā)等,可以考慮使用定時器來實現(xiàn)延時效果。
實戰(zhàn)案例:打造定時數(shù)據(jù)采集程序
需求分析
在實際的項目開發(fā)中,定時采集數(shù)據(jù)并存儲是一個非常常見的需求。例如,在工業(yè)自動化領(lǐng)域,我們需要定時采集各種傳感器的數(shù)據(jù),以便對生產(chǎn)過程進行實時監(jiān)控和分析;在物聯(lián)網(wǎng)項目中,需要定時從各種智能設(shè)備中采集數(shù)據(jù),用于數(shù)據(jù)分析和業(yè)務(wù)決策。
本案例的目標是實現(xiàn)一個定時數(shù)據(jù)采集程序,能夠按照設(shè)定的時間間隔從指定的數(shù)據(jù)源采集數(shù)據(jù),并將采集到的數(shù)據(jù)存儲到本地文件或數(shù)據(jù)庫中,為后續(xù)的數(shù)據(jù)分析和處理提供基礎(chǔ)。
技術(shù)選型
為了實現(xiàn)這個定時數(shù)據(jù)采集程序,我們可以選擇使用System.Threading.Timer來實現(xiàn)定時任務(wù),因為它基于線程池工作,具有較高的執(zhí)行效率,適合在后臺長時間運行的任務(wù)。同時,使用Task.Delay來實現(xiàn)一些簡單的延時操作,以滿足在數(shù)據(jù)采集過程中的一些特殊時間控制需求。
在數(shù)據(jù)存儲方面,我們可以選擇使用文件系統(tǒng)來存儲數(shù)據(jù),將采集到的數(shù)據(jù)以文本文件的形式保存到本地磁盤,這種方式簡單直觀,適合數(shù)據(jù)量較小的場景;如果數(shù)據(jù)量較大或?qū)?shù)據(jù)管理和查詢有更高的要求,也可以選擇使用數(shù)據(jù)庫,如 SQLite、MySQL 等,這里我們先以文件存儲為例進行演示。
代碼實現(xiàn)
下面是一個使用System.Threading.Timer實現(xiàn)定時數(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è)置啟動時間為0,間隔時間為5000毫秒(5秒)
timer = new System.Threading.Timer(callback, null, 0, 5000);
Console.WriteLine("數(shù)據(jù)采集程序已啟動,按任意鍵停止...");
Console.ReadKey();
// 停止定時器
timer.Dispose();
Console.WriteLine("數(shù)據(jù)采集程序已停止");
}
// 回調(diào)函數(shù),用于采集數(shù)據(jù)并存儲
private static void CollectData(object state)
{
// 模擬數(shù)據(jù)采集,這里使用當前時間作為采集數(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)建了一個System.Threading.Timer實例,設(shè)置其回調(diào)函數(shù)為CollectData,首次執(zhí)行時間為 0(即立即執(zhí)行),執(zhí)行間隔為 5 秒。在CollectData回調(diào)函數(shù)中,模擬采集數(shù)據(jù)(這里使用當前時間作為數(shù)據(jù)),并將數(shù)據(jù)追加寫入到名為data.txt的文件中。
到此這篇關(guān)于C#定時器與延時操作的使用的文章就介紹到這了,更多相關(guān)C#定時器與延時操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù)
這篇文章主要介紹了C# HttpClient 如何使用 Consul 發(fā)現(xiàn)服務(wù),幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02
C#提取PDF表單數(shù)據(jù)的實現(xiàn)流程
PDF表單是一種常見的數(shù)據(jù)收集工具,廣泛應(yīng)用于調(diào)查問卷、業(yè)務(wù)合同等場景,憑借出色的跨平臺兼容性和標準化特點,PDF表單在各行各業(yè)中得到了廣泛應(yīng)用,本文將探討如何使用C# 實現(xiàn)自動化PDF表單數(shù)據(jù)提取流程,需要的朋友可以參考下2025-01-01
C#通過經(jīng)緯度計算2個點之間距離的實現(xiàn)代碼
這篇文章主要介紹了C#通過經(jīng)緯度計算2個點之間距離實現(xiàn)代碼,本文對實現(xiàn)原理、經(jīng)緯度基本知識等一并做了講解,需要的朋友可以參考下2014-08-08
C#?線程切換后上下文都去了哪里(.NET高級調(diào)試分析)
總會有一些朋友問一個問題,在 Windows 中線程做了上下文切換,請問被切的線程他的寄存器上下文都去了哪里?這個問題其實比較底層,如果對操作系統(tǒng)沒有個體系層面的理解以及做過源碼分析,其實很難說明白,這篇我們就從.NET高級調(diào)試的角度分析,需要的朋友可以參考下2023-12-12

