繁体   English   中英

如何在asp.net core 1.0 Web API的启动服务中创建后台任务?

[英]How to create a background task in startup service in asp.net core 1.0 Web API?

我正在尝试创建一个后台任务以在我的Web API中发送邮件。 我已经在一个类中创建了一个异步任务,并尝试在构造函数中调用它,但是它没有调用方法。 我想触发此类启动服务。 请在下面找到代码:

//Class to call
public class MailClass
{
    public MailClass()
    {
        Task task = Method1();
    }
    public async Task Method1()
    {
        await Task.Run(() =>
        {
            for (int i = 0; i < 100; i++)
            {
                SendMail();
            }
        });
    }
}

/ Startup.cs /

    public void ConfigureServices(IServiceCollection services)
   {           
            services.AddMvc();
            services.AddSingleton<MailJob>();
   }

提前致谢

这里有很多问题。 首先,异步不是后台处理。 无法保证有线程切换,并且在Web应用程序上下文中,即使存在线程切换,无论哪种方式,它都仍在线程池线程上。 使用Task.Run确保工作将在不同的线程上运行,但实际上仍不是“后台处理”。 同样,尤其是在Web应用程序的上下文中,您只是从池中获取了一个额外的线程,这实际上损害了服务器的整体吞吐量。

如果要在“后台”中运行某些内容,则应将其卸载到单独的进程中 像Hangfire这样的工具可以启用此功能。 出于某种原因,每个尝试使用异步进行后台工作的人都声称由于某些未指定的原因,他们不能使用Hangfire或类似的工具。 您使用完成工作所需的工具。 期。

但是,如果您确实不能或不会使用Hangfire之类的东西,那么您就需要IHostedService类的IHostedService 但是,仅在ASP.NET Core 2.0中可用。 但是,它只需要很少的努力就可以升级,并且升级完全值得进行任何努力。

最后,就像FYI一样,您不能在构造函数中进行异步工作。 如果您确实需要使用一些异步功能来构造您的类,则需要使用诸如静态初始化器模式之类的东西。 本质上,您将异步静态方法添加到类中,该方法返回类的构造实例。 然后,您可以等待。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM