簡體   English   中英

如何在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 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>();
   }

提前致謝

這里有很多問題。 首先,異步不是后台處理。 無法保證有線程切換,並且在Web應用程序上下文中,即使存在線程切換,無論哪種方式,它都仍在線程池線程上。 使用Task.Run確保工作將在不同的線程上運行,但實際上仍不是“后台處理”。 同樣,尤其是在Web應用程序的上下文中,您只是從池中獲取了一個額外的線程,這實際上損害了服務器的整體吞吐量。

如果要在“后台”中運行某些內容,則應將其卸載到單獨的進程中 像Hangfire這樣的工具可以啟用此功能。 出於某種原因,每個嘗試使用異步進行后台工作的人都聲稱由於某些未指定的原因,他們不能使用Hangfire或類似的工具。 您使用完成工作所需的工具。 期。

但是,如果您確實不能或不會使用Hangfire之類的東西,那么您就需要IHostedService類的IHostedService 但是,僅在ASP.NET Core 2.0中可用。 但是,它只需要很少的努力就可以升級,並且升級完全值得進行任何努力。

最后,就像FYI一樣,您不能在構造函數中進行異步工作。 如果您確實需要使用一些異步功能來構造您的類,則需要使用諸如靜態初始化器模式之類的東西。 本質上,您將異步靜態方法添加到類中,該方法返回類的構造實例。 然后,您可以等待。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM