.net – 为什么IHostedService是异步的
我知道这是一个设计问题,但我试图理解这一点,以最好的方式使用它.因此,请考虑这个问题,以澄清它如何与其最大功能一起使用.
为什么它没有设计基于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? 好吧,主要原因是从程序根简化对异步方法的调用.通常,程序流需要调用异步方法(您自己的实现或第三方库). public static void Main(string[] args) { SomeAsyncCall().GetAwaiter().GetResult(); } 但是现在我们可以以干净的方式让它一直异步: static async Task Main(string[] args) { await SomeAsyncCall(); } 这同样适用于IHostedService.StartAsync().它可能需要在主机服务准备期间调用一些异步操作.主机服务概念This discussion有一个明确的声明:
希望这能回答你的问题. 如果您正在寻找有关正确实施IHostedService的文档,请参阅以下内容:Implementing IHostedService in ASP.NET Core 2.0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何从ASP.NET MVC VIEWS文件夹访问HTML文件
- asp.net-mvc-3 – 如何在web.config中设置不同的stmpclient
- 资源-DotNet-站点:DotNet 站点列表
- asp.net-mvc – ASP.NET MVC – 表单和模型绑定器中的多个模
- asp.net – 获取当前请求的凭据以便在WebRequest中使用
- asp.net – 使用linq进行Datalist分页
- asp.net-mvc – 我的剃刀视图的自定义基页类型,如何使用城堡
- 五幅图演示ASP.NET编译过程
- Asp.Net Mvc – 用JQuery替换Ajax.ActionLink
- asp.net-mvc – PartialViews和验证(回发)