2017-12-08 5 views
0

Ich muss Multithreading-Hintergrund-Job für die Importdatei implementieren. Ich habe es mit Hintergrundjob (Hangfire) implementiert. Aber wenn ich einen Thread verwende, geht es sehr langsam. Die Funktion sieht so aus.DbContext pro Anfrage aspboilerplate

Ich benutze Nicht-Transaktionseinheit, um Änderungen in db sofort zu speichern.

Das Problem tritt auf, wenn ich versuche, dies mit Producer-Consumer-Datenflussmuster zu verwenden. Ich lege die Ausnahme "Eine zweite Operation wurde in diesem Kontext gestartet, bevor eine vorherige asynchrone Operation abgeschlossen wurde."

Die Frage ist, wie isoliert DbContext innerhalb dieser Methode erstellen. Bitte helfen Sie mir.

Antwort

0

Transaktionen sollten nicht multi-threaded sein. Wenn Sie eine neue Aufgabe/einen neuen Thread in einer UOW erstellen, können Sie eine separate UOW mithilfe von IUnitOfWork.Begin (TransactionScopeOption.RequiresNew) in einem using-Block erstellen.

die Links Siehe

Wenn Sie Microsoft SQL Server verwenden, dann empfehle ich Ihnen Masseneinsatz zu verwenden. Es ist super schnell als Entity-Framework.

https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql

+0

Ja. Ich finde heraus, bevor Antwort bekommen. Danken. Aber es gab viele Probleme. Ich habe vergessen, MaxLength für E-Mail-Feld hinzuzufügen, auf diese Weise ist es nicht möglich, einen Index für dieses Feld zu erstellen. Aber fließende API hat nichts darüber gesagt. Diese Dinge kommen zu sehr langsamer Suche, auch wenn der Tisch nicht so groß ist. Nach dem Erstellen von Daten Annotation für Feld zur Einschränkung der Länge des Feldes Index erstellt wurde und alles beginnt, schnell zu arbeiten. Und noch etwas, ich benutze Methode für check exist-Methode in db, es funktioniert schneller als firstOfDefault-Methode. – grinay

+0

Was Sie erwähnen, ist bereits als Problem abgelegt ... Sie können https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2762 –

+0

ich aktualisiert meine Antwort (sql Bulk einfügen) –

Verwandte Themen