在C#中如果想要執行一段一直運行的程序,如監聽網絡狀態,實時讀取PLC數據,遇到這種情況有多種解決方法。
方法一,可以起一個Task任務,在Task任務中寫個死循環,這種死循環最好在最后寫個 Thread.Sleep,不然程序會占用很高的CPU。
Task.Factory.StartNew(() => { while (true) { #region 一直運行的代碼 Console.WriteLine("一直運行的代碼"); Thread.Sleep(10); #endregion } },TaskCreationOptions.LongRunning);
方法二
通過繼承BackgroundService接口,實現它的ExecuteAsync方法來達到這種效果
public class Worker : BackgroundService { private readonly ILogger<Worker> _logger; public Worker(ILogger<Worker> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); await Task.Delay(1000, stoppingToken); } } }
在Vs2019中已經有這個新建項目模塊了,可以快速幫我們搭建好項目。
方法三 System.Timers.Timer
//定義Timer System.Timers.Timer Timers_Timer = new System.Timers.Timer(); //手動設置Timer,開始執行 Timers_Timer.Interval = 20; Timers_Timer.Enabled = true; // AutoReset屬性決定計時器是不是要發起一次事件然后停止,還是進入開始/等待的循環。 Timers_Timer.AutoReset = true; Timers_Timer.Elapsed += new System.Timers.ElapsedEventHandler(Timers_Timer_Elapsed); //一直運行的循環 void Timers_Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { Thread.Sleep(1000); }