如何在 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 中创建了一个异步任务,我试图在构造函数中调用它,但它没有调用该方法。我想触发此 class 以启动服务。请在下面找到代码:

//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>();
   }

提前致谢

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

如果您想 运行 "background" 中的某些内容,应该将其卸载到单独的 进程 。 Hangfire 等工具可以实现这一点。出于某种原因,每个尝试使用异步进行后台工作的人都声称,由于某些未指明的原因,他们不能使用 Hangfire 或类似的东西。您使用完成工作所需的工具。期间.

但是,如果您真的不能或不会使用像 Hangfire 这样的东西,那么您需要像 IHostedService 这样的东西。但是,这仅在 ASP.NET Core 2.0 中可用。不过,它只需要很少的努力就可以升级,而且升级 很好 值得付出任何努力。

最后,仅供参考,您不能在构造函数中执行异步工作。如果你真的需要用一些异步功能来构造你的 class,那么你需要使用像静态初始化模式这样的东西。本质上,您向 class 添加一个异步静态方法,returns 是 class 的构造实例。那么,就等着吧。