gpt4 book ai didi

c# - BackgroundService 是否总是在新线程中运行

转载 作者:行者123 更新时间:2023-11-30 15:50:57 33 4
gpt4 key购买 nike

所以在 MSDN对于 ASP.Net Core,它向您展示了如何使用托管服务创建后台任务。甚至有一个特定的段落解释了如何创建后台队列。

现在我的问题是,ExecuteAsync 方法是否已经在其自己的线程中运行,还是我需要先调用 Task.Run

最佳答案

BackgroundService 是否总是在新线程中运行? 不会。

BackgroundService 未指定有关线程的任何内容。它唯一要求的是返回一个 Task 的重载,只要服务启动,它就会保持事件状态。如果需要,您甚至可以返回一个已完成的任务。

如果你check the source code你会发现根本没有假设:

    protected abstract Task ExecuteAsync(CancellationToken stoppingToken);

public virtual Task StartAsync(CancellationToken cancellationToken)
{
_executingTask = ExecuteAsync(_stoppingCts.Token);

if (_executingTask.IsCompleted)
{
return _executingTask;
}

return Task.CompletedTask;
}

服务方法的线程行为取决于实现者,即您。如果 ExecuteAsync 在屈服之前阻塞,则整个服务都会阻塞。如果该方法从不产生,对 StartAsync 本身的调用将阻塞并导致整个应用程序出现问题。

如果 ExecuteAsync 在第一个 await 之前做了一些昂贵的事情,其他服务的启动也会延迟。

这意味着您可能需要使用 Task.Run 如果服务需要在第一次屈服之前做任何昂贵的事情,即第一次调用 await

关于c# - BackgroundService 是否总是在新线程中运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666468/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com