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 Zitieren
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 Zitieren
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. Zitieren
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... Zitieren
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. Zitieren
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? Zitieren
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: Zitieren
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 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.