【问题标题】:How to create a background task in startup service in asp.net core 1.0 Web API?如何在asp.net core 1.0 Web API的启动服务中创建后台任务?
【发布时间】:2018-03-22 21:25:49
【问题描述】:

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

提前致谢

【问题讨论】:

  • 你调查过 HangFire 吗? hangfire.io
  • 或upgrade to Core 2.0。不知道 1.0 有多少支持 反正这篇文章还是不错的阅读。
  • 我已经在核心 1.0 中开发了大部分代码。如果可以用 1.0 完成某些事情,那就更好了。目前我负担不起使用 Hangfire

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


【解决方案1】:

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

如果你想在“后台”运行某些东西,它应该被卸载到一个单独的进程。像 Hangfire 这样的工具可以实现这一点。出于某种原因,每个尝试使用异步进行后台工作的人也声称由于某种未指定的原因他们不能使用 Hangfire 或类似的东西。您使用完成工作所需的工具。期间。

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

最后,作为仅供参考,您不能在构造函数中执行异步工作。如果你真的需要使用一些异步功能来构建你的类,那么你需要使用静态初始化模式之类的东西。本质上,您向您的类添加了一个异步静态方法,该方法返回您的类的构造实例。然后,您可以等待。

【讨论】:

  • 非常感谢。我将尝试通过升级 ASP.NET Core 2.0 来实现 IHostedService
猜你喜欢
  • 1970-01-01
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
相关资源
最近更新 更多