Mehrere dbcontexts in parallele threads, EntityException "Erneut Ihre Aussage, wenn weniger Benutzer aktiv sind,"

Ich bin mit Parallel.ForEach zu tun, die Arbeit auf mehrere threads, mit einer neuen EF5 DbContext für jede iteration, alle eingewickelt in ein TransactionScope, wie folgt:

using (var transaction = new TransactionScope())
{
    int[] supplierIds;

    using (var appContext = new AppContext())
    {
        supplierIds = appContext.Suppliers.Select(s => s.Id).ToArray();
    }

    Parallel.ForEach(
        supplierIds,
        supplierId =>
    {
        using (var appContext = new AppContext())
        {
            Do some work...

            appContext.SaveChanges();                
        }
    });

    transaction.Complete();
}

Nach der Ausführung für ein paar Minuten, es wirft ein EntityException "Der zugrunde liegende Anbieter konnte nicht auf Öffnen ..." mit der folgenden inneren detail:

"Die Instanz von SQL Server Database Engine (Datenbankmodul kann keine LOCK-Ressource erhalten zu dieser Zeit. Erneut Ihre Aussage, wenn weniger Benutzer aktiv sind. Bitten Sie den Datenbankadministrator, um zu überprüfen, die sperren und Speicher-Konfiguration für dieses Beispiel, oder um zu überprüfen, für lang andauernde Transaktionen."

Weiß jemand was dies verursacht oder wie kann es verhindert werden? Danke.

  • Sie sind wahrscheinlich laichen eine Millionen threads, die TPL ist optimiert für kurz -, CPU-gebundene Aufgaben-und nicht CPU-bound-Aufgaben zu verwechseln ("warum gibt es so viel Ersatz-CPU???") in der Laichzeit mehr threads. Verwenden Sie die eingeschränkte Parallelität-scheduler aus der MSDN-Website.
  • msdn.microsoft.com/en-us/library/ee789351.aspx
  • Ich denke, du hast Recht, es war der Laichzeit Lasten von threads. Die Begrenzung der Grad an Parallelität, wie vorgeschlagen, durch bmdixon das problem gelöst.
  • Akzeptierte Antwort geändert 🙂
Schreibe einen Kommentar