由於換了工做也有兩個多月沒有寫博客啦,由於跟着紅超哥(大佬)一直在學習和作項目(反正就是在潛心修煉,大佬天天也是在我十萬個爲何中度過的。)html
// 相似於這樣寫 Task.Run(() => { Console.WriteLine("年輕人"); }).Start();
很快啊 很快,紅超哥就眼神就不對了,完了,完了。當時我就知道紅超哥又要教我了。果不其然紅超哥和我說可使用BackgroundService也就是今天的主角。shell
當時我滿腦子都在想一個劇情
紅超哥:年輕人你這樣寫代碼不優雅,可讀性很差,你在這裏練死勁沒用。
我:有用! 特別有用
...... (後面我沒用)ps:上劇情純屬玩笑異步
如今咱們要實現一個輪詢需求,咱們須要怎麼作呢?(此時此刻我想望向紅超哥,可是我一我的出差了,因此只能本身實現了)async
public abstract class InitBackgroundWork : BackgroundService { //建立一個取消標記源 private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); //入參委託 private Action<object> action; //方法初始話 protected void Init() { action = async e => { while (true) { DoWork(e); await Task.Delay(TimeSpan.FromSeconds(10)); } }; } /// <summary> /// 執行方法 /// </summary> /// <param name="stoppingToken"></param> /// <returns></returns> protected override Task ExecuteAsync(CancellationToken stoppingToken) { Init(); _ = Task.Factory.StartNew(action, cancellationTokenSource.Token); return Task.CompletedTask; } /// <summary> /// 咱們重寫一下關閉方法 /// </summary> /// <param name="cancellationToken"></param> /// <returns></returns> public override Task StopAsync(CancellationToken cancellationToken) { cancellationTokenSource.Cancel(); return base.StopAsync(cancellationToken); } //拋出方法入口 protected abstract void DoWork(object state); }
這樣咱們只須要管入口方法就行了,建立一個類繼承它,而後在配置服務中AddHostedService添加就行了,咱們也能夠直接經過開始方法、結束方法控制就行了ide
public class GetGirlfriend: InitBackgroundWork { protected override void DoWork(object state) { Console.WriteLine("給我1個女友!!!!"); } }