代码之家  ›  专栏  ›  技术社区  ›  MOHAMED IDHRIS SHEIK DAWOOD

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

  •  0
  • MOHAMED IDHRIS SHEIK DAWOOD  · 技术社区  · 7 年前

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

    / 启动。cs公司 /

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

    提前感谢

    1 回复  |  直到 7 年前
        1
  •  1
  •   Chris Pratt    7 年前

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

    如果您想在“后台”运行某些内容,应该将其卸载到单独的 过程 。像Hangfire这样的工具可以实现这一点。出于某种原因,每个试图使用async进行后台工作的人都声称,由于某些未指明的原因,他们不能使用Hangfire或类似的东西。你使用你需要的工具来完成工作。时期

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

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