很长一段时间以来我一直无法找到我的问题的答案。 BackgroundService 是否移至单独的线程?我去论坛上看到答案说后台任务被标记为LongRunning,并且每个后台服务都分配了一个单独的线程,但是在实验过程中
class TestService(ILogger<s> loger) : BackgroundService
{
private readonly ILogger<s> _loger = loger;
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
_loger.LogInformation("Фоновая задача запущена");
while (!stoppingToken.IsCancellationRequested)
{
_loger.LogInformation("Цикл");
}
}
}
整个应用程序冻结并且无法启动但是如果在第一行await Task.Yield()或另一行包含带有异步操作的 await 中添加,则应用程序将成功启动,并且任务随后将继续运行。这是什么意思。后台任务不是在单独的线程中运行,而是在主线程中运行?或者它是在第一个之前在主线程中执行await,然后移至单独的线程?
该方法
ExecuteAsync在处理的同一线程中调用StartAsync。这可以在BackgroundService代码中看到。后台行为不是通过专用线程来实现的,而是通过TAP(基于任务的异步模式)机制来实现的。
StartAsync不等待完成ExecuteAsync。相反,它希望ExecuteAsync立即返回Task,并且其执行将在后台继续。如果在ExecuteAsyncwithout内部启动无限循环await,它将永远阻塞启动它的线程。里面的无限循环BackgroundService必须是异步的,以避免阻塞线程。