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

时间:2018-03-22 07:20:57

标签: c# multithreading asp.net-core asp.net-core-webapi asp.net-core-1.0

我正在尝试创建后台任务以在我的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>();
   }

提前致谢

1 个答案:

答案 0 :(得分:1)

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

如果您想在“后台”中运行某些内容,则应将其卸载到单独的进程。 Hangfire等工具实现了这一目标。出于某种原因,每个试图使用异步进行后台工作的人也声称,由于某些未指明的原因,他们不能使用Hangfire或类似的东西。您可以使用所需的工具来完成工作。周期。

但是,如果您真的不能或不会使用像Hangfire这样的东西,那么您需要IHostedService之类的东西。但是,这仅适用于ASP.NET Core 2.0。但是,升级需要很少的努力,并且升级以及值得所需的任何努力。

最后,就像一个FYI,你不能在构造函数中做异步工作。如果您真的需要使用一些异步功能构建您的类,那么您需要使用类似静态初始化模式的东西。实际上,您向类中添加了一个异步静态方法,该方法返回类的构造实例。然后,你可以等待。