我试图在ASP.Net Core中加载一个页面时运行一个异步任务,也就是说,我希望任务尽快在用户路由到页面时运行,但对于该任务完成之前要显示的页面。看来,使用ASP.Net核心,您可以使用中间件来执行此类任务。所以我试图下面添加到Startup.cs
使用ASP.Net核心中间件启动后台任务
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider)
{
// Other configurations here
app.Use(async (context, next) =>
{
if (context.Request.Path.Value.Contains("PageWithAsyncTask"))
{
var serviceWithAsyncTask = serviceProvider.GetService<IMyService>();
await serviceWithAsyncTask .DoAsync();
}
await next.Invoke();
});
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
上述的问题是,有在页面加载延迟,直到DoAsync
已经完成,因为我们不叫next.Invoke()
直到DoAsync
完成。我如何正确实现上述这样的next.Invoke()
是在DoAsync
运行后立即调用的?
* Asp.Net的Web API应用程序,它使用Quartz.Net计划作业*出这个范围分辩的? – ibubi
@ibubi:Quartz.Net和HangFire各有其缺点;我认为它们是'IApplicationLifetime'的替代品。 –
谢谢,但我不明白,数以百计的Asp.net和Quartz.Net或Hangfire实现教程都提供了建议,请您参考一个简要文档解释为什么我们应该避免在Asp.Net中使用这两个或我们的自定义库? – ibubi