Führen Sie eine hintergrund-task aus einer controller-action in asp.net core 2
Ich bin der Entwicklung einer web-Applikation mit einer REST-Api mit C# mit asp.net core 2.0
Was ich erreichen möchte ist, wenn der client eine Anfrage senden an einen Endpunkt ich werde führen Sie eine hintergrund-Aufgabe, getrennt von der client-Anfrage-Kontext wird beendet, wenn die Aufgabe erfolgreich gestartet wurde.
Ich weiß, es ist HostedService aber das problem ist, dass die HostedService gestartet, wenn der server startet, und soweit ich weiß, gibt es keinen Weg, um zu starten die HostedService manuell von einem controller.
Hier ist ein einfacher code, der demonstrieren Frage.
[Authorize(AuthenticationSchemes = "UsersScheme")]
public class UsersController : Controller
{
[HttpPost]
public async Task<JsonResult> StartJob([FromForm] string UserId, [FromServices] IBackgroundJobService backgroundService) {
//check user account
(bool isStarted, string data) result = backgroundService.Start();
return JsonResult(result);
}
}
- Verwenden Sie ein Drittanbieter-tool wie Hangifre, aber es muss Tausende von ähnlichen Fragen zu diesem hier.
- Danke für den Kommentar, ich landete mit Hangfire, es ist sehr mächtig. Prüfen, schreiben eine Antwort, so kann ich es akzeptieren.
- Ich landete mit Hangfire zu, so einfach zu bedienen, im Vergleich zu faffing über die mit einem HostedService. Sollten Sie auf jeden Fall setzen das als Antwort
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie weiterhin verwenden
IHostedService
als Basis für die hintergrund-tasks in Kombination mitBlockingCollection
.Erstellen wrapper für
BlockingCollection
so können Sie injizieren es als singleton.Dann in der Umsetzung der
IHostedService
"hören" für Aufgaben und bei Aufgaben, die "ankommen" ausführen.BlockingCollection
Stoppt die Ausführung, wenn die Sammlung leer ist - also Ihrewhile
Schleife wird nicht verbraucht CPU-Zeit..Take
Methode akzeptierencancellationToken
als argument. Mit token können Sie " Abbrechen "Wartezeit" für die nächste Aufgabe, wenn die Anwendung beendet.Und in der Steuerung fügen Sie einfach die Aufgabe, die Sie ausführen möchten, um unsere Sammlung
Wrapper für die Sperrung Sammlung registriert werden soll, für dependency injection als singleton
Register hintergrund-Dienst
ContextFactory
schaffen neuen Kontext jedes mal, wenn er fragte.Microsoft hat dokumentiert, das gleiche bei https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1
Er erreicht mit BackgroundTaskQueue, die bekommt Arbeit zugewiesen von der Steuerung und der Arbeit erfolgt durch QueueHostedService die sich von BackgroundService.