Veröffentlicht 17. September 200816 j Moin, ich hab ein kleines Problem mit einer Anwendung. Meine Klasse A führt eine riesen Berechnung durch, die sehr lange dauern würde. Deshalb wollte ich 2 Threads dieser Klasse anlegen und die Berechnung aufteilen. Das Ergebnis jeder Berechnung soll in eine XML geschrieben werden. Die Klasse des Writers ist statisch. Und genau an der STelle knallt es dann zu unbestimmter Zeit immer mal wieder. Da vermischen sich die Ergebnisse. Kann mir da jemand was zu sagen, auch im Hinblick auf Threadsicherheit etc... Thx
17. September 200816 j Schau dir mal die folgenden Seiten an, die sollten das nötige erklären: Threading in C# - Free E-book .NET Column: Safe Thread Synchronization
17. September 200816 j Vermutlich reicht ein lock Statement um die Stelle an der du auf den Writer zugreifst, allerdings kann ich nur wärmstens empfehlen dich mit Synchronisierung von Threads auseinanderzusetzen, sonst fängst du dir schnell andere Probleme ein die auf deiner Testmaschine evtl. nicht auftreten.
17. September 200816 j Kurz gesagt: Deine Klassen versuchen vermutlich gleichzeitig auf eine Ressource zuzugreifen... Wie meine Vorposter schon gesagt haben: Lies dich mal in Threadsicherheit ein... Im Prinzip ist es dann so, dass ein Thread sich seine Ressource locked und sie benutzt. In dieser Zeit kann der andere Thread diese Ressource nicht benutzen und muss warten. Nach der Benutzung gibt der erste Thread die Ressource frei und der zweite Thread darf die Ressource nutzen...
17. September 200816 j Nach der Benutzung gibt der erste Thread die Ressource frei und der zweite Thread darf die Ressource nutzen... ... was letztlich 2 Threads für "eine riesen Berechnung" nicht empfehlbar macht, dann sollte lieber eine Thread genutzt werden und er führt beide Berechnungen aus (damit das Programm währenddessen nicht blockt), benachrichtigt dann eine Funktion und diese schreibt die Ergebnisse in eine Datei oder was auch immer.
17. September 200816 j Autor Warum ich die Berechnung aufteile ist ganz einfach, warum sollte ich den 2. Kern nicht nutzen? Also wäre doch das Logischste die Berechnung aufzuteilen, oder hab ih da nen Denkfehler?
17. September 200816 j Autor Nabend Ich bin bei lock() fündig geworden. Hier mal ein kleines Bsp: using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.IO; namespace test_multithreads { class Program { static void Main(string[] args) { test Test = new test(); Thread thread_1 = new Thread(new ThreadStart(Test.testschreiben)); Thread thread_2 = new Thread(new ThreadStart(Test.testschreiben)); thread_1.Name = "Thread_1"; thread_2.Name = "Thread_2"; thread_1.Start(); thread_2.Start(); } } class test { public void testschreiben() { lock (this) { string internerText = string.Empty; for (int i = 1; i < 100000; i++) { Writer.schreibeInText(("Thread: " + i.ToString() + "\tThreadname: " + Thread.CurrentThread.Name)); } } } } static class Writer { static StreamWriter sw = new StreamWriter(@"C:\test.txt"); public static void schreibeInText(object text) { sw.WriteLine("Test: " + Thread.CurrentThread.Name + " : " + text); } } } Das funktioniert auch alles wunderbar, allerdings werden die letzten Zeilen des 2. Threads nicht in die Datei geschrieben, und ich hab keine Ahnung warum nicht?!?! Jemand eine Idee??:confused:
22. September 200816 j Hallo, hier ein paar Tipps (...obwohl in den vorherigen Postings alles steht, was du zur Lösung deines Problems wissen musst): Wenn dein Programm die Main-Funktion verlässt, ist dein Programm beendetStreams sollte man schließenDas Design mit der Writer Klasse und dem statischen StreamWriter ist meiner Meinung nach fragwürdig... Viel Erfolg! mep
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.