McSaesch Geschrieben 17. September 2008 Geschrieben 17. September 2008 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
Guybrush Threepwood Geschrieben 17. September 2008 Geschrieben 17. September 2008 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
Argbeil Geschrieben 17. September 2008 Geschrieben 17. September 2008 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.
SoL_Psycho Geschrieben 17. September 2008 Geschrieben 17. September 2008 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...
TDM Geschrieben 17. September 2008 Geschrieben 17. September 2008 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.
McSaesch Geschrieben 17. September 2008 Autor Geschrieben 17. September 2008 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?
McSaesch Geschrieben 17. September 2008 Autor Geschrieben 17. September 2008 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:
Mephisto81 Geschrieben 22. September 2008 Geschrieben 22. September 2008 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
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden