Entity Framework Thread safe machen
-
Guten morgen zusammen,
wir arbeiten in unserem Team sehr viel mit dem EF und haben uns schon oft darüber geärgert, das die Sache nicht Thread Safe ist. Nun haben wir uns also überlegt, dass wir ein AddIn für die VS2010 entwicklen das das EF Thread Safe macht;-)
So stelle ich mir das vor. Ich generiere mir meine *.edmx File. Dann würde ich gerne mit einem Rechtsklick im Kontextmenü einen neuen Eintrag sehen und mit einem Klick auf diesen Eintrag macht er mit die Code behind File Thread Safe:-P
Ich würde das ganze so tief wie möglich ansetzen. Sprich direkt in den Entitäten bzw im ObjectContext.
Nun die Frage an euch:
Wer hat sowas schon mal versucht und kann mir einen Tipp geben, wo ich dort am effektivsten einhaken muss?
-
Hallo secondsun
Wie stellt ihr euch eine solche vollautomatische Lösung vor? Threadsicherheit alleine heißt nicht, dass beliebige Threads ohne eigenes Zutun einfach mit dem gleichen Objekt arbeiten können, ohne dass es früher oder später knallt.
Wenn mehrere Threads auf die gleichen Objekte zugreifen, kann methodenübergreifende Konsistenz nicht auf magische Weise in dem internen Code der Klasse erreicht werden. Ebensowenig wird es gelingen, etwas so komplexes wie Frameworks, über Wrapper, threadkonsistent zu machen.
Kennst Du die statische Methode System.Collections.Queue.Synchronized()? Damit werden einfach Queues threadsafe gemacht. Wunderbar.
Hast Du dich schonmal gefragt, warum es in System.Collections.Generic kein Pendant dazu gibt? Nachdem was ich vor einiger Zeit mal gelesen habe: Weil zu viele Programmierer in eben jene Falle gelaufen sind und erwartet haben, dass die threadsichere Queue nun beliebig über Threadgrenzen hinweg verwendet werden kann.
Um den Punkt zu verdeutlichen. Folgendes raucht so gut wie immer mit einer InvalidOperationException ab:
class Program { static void Main(string[] args) { Queue q = System.Collections.Queue.Synchronized(new Queue(Enumerable.Range(0, 100).ToList())); new Thread((o) => Worker(q)).Start(); Worker(q); Console.ReadKey(true); } private static void Worker(Queue q) { while (q.Count > 0) { Thread.Sleep(10); Console.WriteLine((int)q.Dequeue()); } } }
Erst wenn Worker synchronisiert wird, funktioniert es.
Auch wenn ich mit dem EF nicht arbeite (sondern mit nHibernate), behaupte ich einfach mal, dass euer Vorhaben nicht möglich ist.
Was man aber realisieren kann, sind Hilfklassen, welche die Arbeit bei Multithreading erleichtern. Ist nur die Frage, was genau erreicht werden soll.