mvc基礎框架做Timer定時任務
Timer,CancellationToken,IHostedService,IDisposable注意使用的類
本來是要做依賴注入 方法在介面上實現 現在出了點其他報錯原因 先把程式碼實現
首先宣告一個介面 繼承IHostedService,IDisposable他會繼承實現我們要使用的方法
public interface IService : IHostedService, IDisposable { void exec(); }
第二步建一個Service繼承IService
`public class Service : IService
{
public static int a = 0;
private Timer _timer;
/// <summary> /// 繼承IHostedService /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StartAsync(CancellationToken cancellationToken) { _timer = new Timer(dowork, null, TimeSpan.Zero, TimeSpan.FromSeconds(2));//頻率兩分鐘一次 return Task.CompletedTask; } public void dowork(object state) { exec(); } /// <summary> /// 執行程式碼塊 /// </summary> public void exec() { a++; Console.WriteLine("第{0}次執行", a); } /// <summary> /// 繼承IHostedService /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public Task StopAsync(CancellationToken cancellationToken) { _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } /// <summary> /// 繼承IDisposable /// </summary> public void Dispose() { _timer?.Dispose(); } }`
第三步 程式啟動後 自動呼叫Service
public class HomeController : Controller { //這裡依賴注入報錯 不知道原因 //private IService _service; //private HomeController(IService service) //{ // _service = service; //} public IActionResult Index() { //CancellationTokenSource 和 CancellationToken在非同步任務中的使用 // CancellationTokenSource cts = new CancellationTokenSource(1000); 或者傳入時間 毫秒 或者Timespan //建立一個 CancellationTokenSource,然後呼叫非同步方法時,傳入 CancellationToken,它是一個輕量級物件,可以通知請求是否已取消 CancellationTokenSource cts = new CancellationTokenSource(); Service service = new Service(); service.StartAsync(cts.Token); return View(); } }
最後實現效果 自動執行