加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

.net – 为什么IHostedService是异步的

发布时间:2020-12-16 06:40:38 所属栏目:asp.Net 来源:网络整理
导读:我知道这是一个设计问题,但我试图理解这一点,以最好的方式使用它.因此,请考虑这个问题,以澄清它如何与其最大功能一起使用. 为什么它没有设计基于KISS的同步并具有异步方法(StartAsync,StopAsync),AFAIK,Web请求中Async的主要好处是让一些空闲线程被释放用于
我知道这是一个设计问题,但我试图理解这一点,以最好的方式使用它.因此,请考虑这个问题,以澄清它如何与其最大功能一起使用.

为什么它没有设计基于KISS的同步并具有异步方法(StartAsync,StopAsync),AFAIK,Web请求中Async的主要好处是让一些空闲线程被释放用于服务进一步请求但它不能IHostedService的情况,因为没有请求的概念,并且总有一个运行(或挂起)线程.

解决方法

我们走下兔子洞吧.

IHostedService的实例由HostedServiceExecutor.StartAsync()调用,它是异步的(HostedServiceExecutor source code).

HostedServiceExecutor.StartAsync()由WebHost.StartAsync()调用,它是异步的(WebHost source code).

WebHost实现了IWebHost,它具有启动的同步和异步版本:Start和StartAsync.但是WebHost.Start()实现只调用异步版本:

public void Start()
{
    StartAsync().GetAwaiter().GetResult();
}

最后,WebHost.Start()由Program.Main调用(默认情况下由ASP.NET Core项目模板生成):

public static void Main(string[] args)
{
    BuildWebHost(args).Run();
}

有了这个调用链,我们可以继续你的问题“为什么IHostedService是异步的?”得到“为什么IWebHost是异步的?”或者“为什么c#7引入了异步Main()方法?”.

您可以通过以下讨论获得推理:

> What is the point of having async Main?
> Proposal: Add Async support for Main() / Console Apps
> C# 7 Series,Part 2: Async Main

好吧,主要原因是从程序根简化对异步方法的调用.通常,程序流需要调用异步方法(您自己的实现或第三方库).
用旧方法我们做这样的事情:

public static void Main(string[] args)
{
    SomeAsyncCall().GetAwaiter().GetResult();
}

但是现在我们可以以干净的方式让它一直异步:

static async Task Main(string[] args)
{
    await SomeAsyncCall();
}

这同样适用于IHostedService.StartAsync().它可能需要在主机服务准备期间调用一些异步操作.主机服务概念This discussion有一个明确的声明:

The StartAsync method is asynchronous because we may need to execute
some preparation tasks for the job that may fail to execute and
compromise the initialization.

希望这能回答你的问题.

如果您正在寻找有关正确实施IHostedService的文档,请参阅以下内容:Implementing IHostedService in ASP.NET Core 2.0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读