Ich denke wahrscheinlich nicht in die richtige Richtung. Ich bin ziemlich neu in Dependency Injection und ASP.Net Core.DbContext für Hintergrundaufgaben über Dependency Injection
Ich habe eine ASP.Net Core-Website, und eine der Aufgaben besteht darin, Daten aus einem Excel-Blatt in eine Datenbank zu importieren, die ein Benutzer hochladen wird. Die Excel-Tabellen können riesig sein, und die Datentransformationsaufgaben sind zeitaufwendig, daher möchte ich sie im Hintergrund ausführen. h. Der Benutzer lädt das Blatt hoch, die Antwort wird sofort gesendet und der Hintergrund-Job/Thread importiert die Daten.
Ich versuche, den Hintergrund-Job von laufen:
Task.Run(() => ProcessImport(model));
Das Problem, das ich laufen in ist, dass der Prozess Importmethode Dienste aufruft, die die AppDbContext über ASP.Net Dependency Injection Container Zugriff auf die Repository-Klassen ist als Scoped hinzugefügt und sobald die Antwort zurückgeschickt wird, wird der Kontext entsorgt. Ich bekomme eine Laufzeitausnahme, dass Sie einen Kontext nicht verwenden können, nachdem es entsorgt wurde.
Meine Frage ist, was ist der beste Weg, um mit dieser Situation umzugehen? Soll ich den AppDbContext Singleton machen? Soll ich eine neue Instanz von AppDbContext in der ProcessImport-Methode erstellen und weitergeben? Ich habe DbContext gelesen ist Thread nicht sicher, also ist das ein guter Ansatz?
Nein: https://stackoverflow.com/questions/3266295/net-entity-framework-and-transactions/3266481#3266481 – Steven
Sie haben Recht, aber wie mit laufenden Aufgaben in einem anderen Thread, die auf DbContext zugreifen müssen? –
Das ist sowieso ein gefährliches Muster. Sie sollten keine ASP.Net-Anwendung verwenden, um [lang andauernde Fire & Forget-Aufgaben auszuführen] (http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx). Wenn Sie es richtig machen, wird die Aufgabe in einem eigenen Prozess ausgeführt und das gesamte DI-Problem ist weg. –