.NET寶藏API之:IHostedService,后台任務執行


我們在項目開發的過程中可能會遇到類似后台定時任務的需求,比如消息隊列的消費者。

按照.NetF時的開發習慣首先想到的肯定是Windows Service,拜托,都什么年代了還用Windows服務(小聲bb)

不用 Windows服務這不是還有Quartz之流的包嘛,也不是不行,但是隨便一點小需求就上這么重的包,是不是有點大材小用了。

除了上面的方案,Task.Run也不失為一個好方法,方便簡單,直接在管道:

Task.Run(() =>
{
	while (true)
	{
		Console.WriteLine("running");
		Thread.Sleep(1000);
	}
});

Ok,搞定

嗯......也不是不行,總覺得缺了點什么?難道是優雅?

IHostedService

IHostedService微軟給的定義如下,大致的意思就是:定義主機托管對象的方法

Defines methods for objects that are managed by the host.

下面我們就來實現一下:

public class WorkService : IHostedService, IDisposable
{
	private Timer timer;
	public void Dispose()
	{
		timer.Dispose();
	}

	public Task StartAsync(CancellationToken cancellationToken)
	{
		Console.WriteLine("start");
		timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
		return Task.CompletedTask;
	}

	public Task StopAsync(CancellationToken cancellationToken)
	{
		Console.WriteLine("end");
		timer?.Change(Timeout.Infinite, 0);
		return Task.CompletedTask;
	}

	private void DoWork(object state)
	{
		Console.WriteLine("running");
	}
}

然后在 ConfigureServices 注冊:

services.AddHostedService<WorkService>();

image

是不是既優雅又 so easy

猴:放屁,本來幾行代碼就能解決的,你這用了這么多行才實現,優雅個屁。

別着急,這不是贈送了兩個功能嘛:startend,很划算的啦。

猴:我不要這兩個功能,我只要執行任務,你這個就是不行。

得,不要就不要,微軟大大都給你准備好了。

BackgroundService

BackgroundService是微軟封裝的一個IHostedService派生類,顧名思義:后台服務嘛,往下看:

public class WorkService : BackgroundService
{
	protected async override Task ExecuteAsync(CancellationToken stoppingToken)
	{
		while(!stoppingToken.IsCancellationRequested)
		{
			Console.WriteLine("running");
			await Task.Delay(1000, stoppingToken);
		}
	}
}

還是一樣的注冊:services.AddHostedService<WorkService>();,運行結果就...還是放一下吧。

image

這下夠優雅了吧。

猴:那還有更優雅的嗎?

年輕人,要知足(其實我也不知道了)

因為 BackgroundServiceIHostedService的派生類,如果你想要使用 startend也是可以的哦。

public override Task StartAsync(CancellationToken cancellationToken)
{
	Console.WriteLine("start");
	return base.StartAsync(cancellationToken);
}

public override Task StopAsync(CancellationToken cancellationToken)
{
	Console.WriteLine("end");
	return base.StopAsync(cancellationToken);
}

好了,這期的寶藏API就到這了,下期再見哦,如果有下期的話。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM