mvc访问控制器后做Timer定时任务继承IHostedService类
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();
}
}
最后实现效果 自动执行

浙公网安备 33010602011771号