我正在尝试创建后台任务以在我的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>();
}
提前致谢
答案 0 :(得分:1)
这里有很多问题。首先,异步是不后台处理。无法保证线程切换,并且在Web应用程序上下文中,即使存在线程切换,它仍然在线程池线程上,无论哪种方式。使用Task.Run
确保工作将在不同的线程上运行,但它仍然不是真正的“后台处理”。同样,特别是在Web应用程序的上下文中,您只是从池中获取了一个额外的线程,这实际上会损害您的整体服务器吞吐量。
如果您想在“后台”中运行某些内容,则应将其卸载到单独的进程。 Hangfire等工具实现了这一目标。出于某种原因,每个试图使用异步进行后台工作的人也声称,由于某些未指明的原因,他们不能使用Hangfire或类似的东西。您可以使用所需的工具来完成工作。周期。
但是,如果您真的不能或不会使用像Hangfire这样的东西,那么您需要IHostedService
之类的东西。但是,这仅适用于ASP.NET Core 2.0。但是,升级需要很少的努力,并且升级以及值得所需的任何努力。
最后,就像一个FYI,你不能在构造函数中做异步工作。如果您真的需要使用一些异步功能构建您的类,那么您需要使用类似静态初始化模式的东西。实际上,您向类中添加了一个异步静态方法,该方法返回类的构造实例。然后,你可以等待。