Laden...

Zugriff mehrerer Tasks auf Objektkontext (EF4)

Erstellt von Tris vor 13 Jahren Letzter Beitrag vor 13 Jahren 843 Views
T
Tris Themenstarter:in
18 Beiträge seit 2009
vor 13 Jahren
Zugriff mehrerer Tasks auf Objektkontext (EF4)

verwendetes Datenbanksystem: MS SQL Server 2008

Hallo,

ich versuche, mittels zweier Tasks auf die AdventureWorksLT2008R2 - Datenbank zuzugreifen und zwei Listen (Customer und SalesOrderHeader) zu befüllen.

Mein Code ist in einem ButtonClick - Event hinterlegt:

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            custList.Clear();
            orderheaderList.Clear();


            var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();


            var custTask = Task.Factory.StartNew<List<Customer>>(() =>
                {
                    var cQuery = context.Customer;

                    return cQuery.ToList();
                }).ContinueWith((task) =>
                    {
                        foreach (var item in task.Result)
                        {
                            custList.Add(item);
                        }
                    }, uiScheduler);

           // Task.WaitAll(custTask)   <-- Anwendung friert ein


            var ohTask = Task.Factory.StartNew<List<SalesOrderHeader>>(() =>
                {
                    var soQuery = context.SalesOrderHeader;

                    // custTask.Wait()   <-- Anwendung friert ein

                    return soQuery.ToList();
                }).ContinueWith((task) =>
                    {
                        foreach (var item in task.Result)
                        {
                            orderheaderList.Add(item);
                        }
                    }, uiScheduler);
        }

Beim Ausführen gibt mir VS 2010 eine Exception mit bspw. Inhalt
"Typ 'AdventureWorksLT2008R2Model.FK_CustomerAddress_Address_AddressID' wurde mehrmals zugeordnet." (immer unterschiedlich, mal "Unter-Entities", mal Referenzen) zurück.

Meiner laienhaften Beurteilung nach kommt der Objektkontext/-StateManager ins Schlingern, wenn Objekte + Unterobjekte/Referenzen durch Task A hinzugefügt werden sollen, dies aber gerade durch Task B geschehen ist. (verbessert mich bitte, ich stecke in der Taskprogrammierung und dem, was drumrum hängt, leider nicht so tief drin, wie ich gern würde 😉 )

Meine Frage jetzt: Gibt es eine Möglichkeit, mit einem Objektkontext und mehrere Tasks Tabellen abzufragen, ohne dass diese sich ins Gehege kommen?

Ein custTask.Wait() bzw. Task.WaitAll(custTask) lassen meine Anwendung einfrieren (im Code auskommentiert)

Danke im Voraus,
Tris

6.911 Beiträge seit 2009
vor 13 Jahren

Hallo,

warum verwendest du den UI-Scheduler, der ist für diese Aufgabe gar nicht geeignet. Der Standard-Scheduler reicht hier.

Das von dir geschilderte Problem hört sich so an dass die Zugriffe auf den ObjectContext nicht synchronisiert werden. Hast du dich versichert dass die Methoden des ObjectContext threadsicher sind? Ich weiß es nicht, aber laut Fehler gehe ich davon aus dass sie es nicht sind. Also musst du selbst für die Synchronisierung sorgen (Stichwort: lock - bitte selbst in der :rtfm: rausfinden). Wenn du dich damit gar nicht auskennst dann arbeitet dich in die Grundlagen von Threading ein oder vergiss die TPL 😉

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

T
Tris Themenstarter:in
18 Beiträge seit 2009
vor 13 Jahren

Hallo gfoidl,

den UI Scheduler verwende ich, da die Listen an Comboboxen gebunden sind und ohne diesen zur Laufzeit eine Exception geworfen wird.

Die TPL mag ich ungern vergessen, daher war dein Hinweis auf lock genau das Richtige für mich. Vielen Dank, damit funktioniert's jetzt.

Gruß, Tris