2017-07-10 11 views
5

Ist das folgende ein korrektes Muster, um lange laufende Hintergrundarbeit in Asp.Net Kern zu implementieren? Oder sollte ich eine Form von Task.Run/ mit TaskCreationOptions.LongRunning Option verwenden?Asp.Net Kern lange laufende Aufgabe

public void Configure(IApplicationLifetime lifetime) 
    { 
     lifetime.ApplicationStarted.Register(() => 
     { 
      // not awaiting the 'promise task' here 
      var t = DoWorkAsync(lifetime.ApplicationStopping); 

      lifetime.ApplicationStopped.Register(() => 
      { 
       try 
       { 
        // give extra time to complete before shutting down 
        t.Wait(TimeSpan.FromSeconds(10)); 
       } 
       catch (Exception) 
       { 
        // ignore 
       } 
      }); 
     }); 
    } 

    async Task DoWorkAsync(CancellationToken token) 
    { 
     while (!token.IsCancellationRequested) 
     { 
      await // async method 
     } 
    } 
+7

Sie eine Bibliothek wie 'Hangfire' verwenden könnte, dies zu tun. – NtFreX

Antwort

9

verfolgt das ein korrektes Muster lange Laufhintergrundarbeit in Asp.Net Kern zu implementieren?

Ja, dies ist der grundlegende Ansatz zum Starten lang laufender Arbeit an ASP.NET Core. Sie sollten sicherlich nicht verwenden Task.Run/StartNew/LongRunning - dieser Ansatz hat immer war falsch.

Beachten Sie, dass Ihre lang andauernde Arbeit zu jeder Zeit heruntergefahren werden kann, und das ist normal. Wenn Sie eine zuverlässigere Lösung benötigen, sollten Sie über ein separates Hintergrundsystem außerhalb von ASP.NET verfügen (z. B. Azure-Funktionen/AWS-Lambdas). Es gibt auch Bibliotheken wie Hangfire, die Ihnen einige Zuverlässigkeit geben, aber ihre eigenen Nachteile haben.

+0

Dank Stephen - meine Zweifel an diesem Ansatz war genau über das, was Sie erwähnten "Arbeit kann jederzeit abgeschaltet werden". Unter der Annahme, dass ich keine Ausnahmen von der asynchronen Methode lasse, wann würde die Laufzeit die asynchrone Arbeit beenden? – ubi

+2

@ubi: ASP.NET recycelt gelegentlich, nur um die Dinge sauber zu halten. Auch die üblichen Gründe: Betriebssystem-Updates, Cloud-Orchestrierung in Bewegung, Stromausfälle usw. –

+0

Nochmals vielen Dank. Können Sie ASP.NET * Core * recycling ein bisschen mehr erklären? Ich habe nirgendwo anders darüber gelesen (mit Ausnahme des IIS App Pool Recycles). Ich betreibe dies als eine Konsolen-App. Startet die Laufzeit die App oder die Request-Pipeline neu (Signal 'ApplicationStopping/Stopped' und rufe die' Configure'-Methoden in 'Startup' erneut auf oder so)? – ubi

4

Überprüfen Sie auch .NET Core 2.0 IHostedService. Hier ist die documentation. Von .NET Core 2.1 haben wir abstrakte Klasse.

public class UpdateBackgroundService: BackgroundService 
{ 
    private readonly DbContext _context; 

    public UpdateTranslatesBackgroundService(DbContext context) 
    { 
     this._context= context; 
    } 

    protected override async Task ExecuteAsync(CancellationToken stoppingToken) 
    { 
     await ... 
    } 
} 

In Ihrem Start Sie müssen nur registrieren Klasse: Es kann wie folgt verwendet werden

public static IServiceProvider Build(IServiceCollection services) 
{ 
    //..... 
    services.AddSingleton<IHostedService, UpdateBackgroundService>(); 
    //..... 
} 
Verwandte Themen