C# Threading , Asynchrone Events und Datei lock

.:L

0
Hallo Hackerboardler,

in nachfolgendem Code versuche ich Pings asynchron zu senden und die Ergebnisse in zufällig generierte Dateien zu schreiben.

Code: [C#] using System; using System.Collections.Generic; using System.Linq; using Syst - Pastebin.com

Es scheint mir so, als ob ich noch ein Problem beim Schreiben der Datei habe. Meine Prüfung mit dem Lock scheint nicht so zu funktionieren, wie ich mir das vorstelle...Des Weiteren bricht er manchmal bereits nach einer IP ab. Habe ich das mit while (PTH.IsAlive) falsch verstanden?

Oder ist es so, dass das Programm beendet wird, bevor ich eine Möglichkeit habe die Datei zu schreiben? Das Programm wird beendet, sobald IsAlive false ist. Was wird false gesetzt? Sobald kein aktiver Thread mehr vorhanden ist?

Vielleicht sehe ich auch grad den Wald vor lauter Bäumen nicht... Kam heute schon des öfteren vor.

Vielen Dank im Voraus
 
Hoi,

also die erste Sache die ich nicht verstehe ist diese while(!open):
Code:
FS = File.OpenWrite(fileName);
{
    FS.Close();
    open = true;
}
Bin leider aus der C++ Ecke und deswegen hier die Frage ob man einfach die if() in C# weglassen kann?

Dann öffnest du eine Datei mit einem zufälligen Dateinamen.
Warum dann überhaupt prüfen ob die "result.txt" geöffnet werden kann?

Zu deinem Hauptproblem:
Du wartest in deinem Hauptprogramm nur auf den Thread von PTH.
Code:
while (PTH.IsAlive)
{
    Console.WriteLine("...");
}
Dieser erstellt jedoch via P.SendAsync viele neue Threads (für jeden Host einen)
Jetzt kann es passieren, das PT schon alle Pings-Threads gestartet hat und sagt "Ich bin fertig", obwohl noch auf keinen Ping geantwortet wurde.
So glaubt das Hauptprogramm wiederrum der Thread ist fertig und terminiert danach einfach den Prozess.
Das Ergebnis in den Text-Datein hängt dann davon ab, welche Ping-Requests schon beantwortet wurden und PingCompleted() ausgeführt wurde.
Du musst der Funktion PT aus der Klasse pingThread irgendwie klarmachen, dass diese auf die Antworten der Pings warten muss.

MfG
Inliferty
 
Hi Inliferty,

danke für deine Antwort.

Wegen result.txt: Ich hatte Zufallszahlen gewählt, um zu testen wie viele Events ich verarbeite. Ich habe nämlich noch das Problem, dass er mir nicht alle Zeilen in die Datei schreibt, sondern immer die Datei plattmacht und dann nur den aktuellen Satz schreibt. Mal gucken was ich da noch falsch mache.

Habe versucht das ganze mit globalen Variablen zu lösen.

Zunächst zähle ich, wie viele Pings abgesetzt wurden. Anschließend prüfe ich im Event, ob alle Pings gemeldet wurden. Ist dies der Fall, wird das Programm beendet.

Jetzt habe ich nurnoch 1 Problem: Wie schon beschrieben habe ich am Ende des Programms immer nur einen Eintrag.

Code:
TextWriter TW = new StreamWriter(fileName);
TW.WriteLine(text);
TW.Close();

Was mache ich falsch?

Aktuelle Version: [C#] using System; using System.Collections.Generic; using System.Linq; using Syst - Pastebin.com
 
eine sache vorweg:
das problem mehrere paralelle aufgaben zu haben und auf die fertigstellung aller aufgaben zu warten ist nicht neu, die lösung des problems auch nicht ... warum also das rad neu erfinden?

schau dir mal System.Threading.WaitHandle an ... jeder deiner threads bekommt eins (z.B. ein Mutex), und muss es signalisieren (ReleaseMutex()) wenn der thread fertig ist...

dein thread der auf die ausführung warten soll, kann ein array dieser WaitHandle-objekte nehmen und es als parameter für WaitHandle.WaitAll() verwenden.


nun zu deinem problem mit der datei:

Konstruktor der StreamWiriter-Klasse hat gesagt.:
Der path-Parameter kann ein Dateiname sein, u. a. eine Datei in einer UNC-Freigabe (Universal Naming Convention). Wenn die Datei vorhanden ist, wird sie überschrieben; andernfalls wird eine neue Datei erstellt.

ergo überschreibst du deine datei X mal und der letzte schreibende thread hinterlässt seine version ...

lösungsvorschläge:
lasse die einzelnen vorgänge ihre daten in StringBuilder-Objekten sammeln, und lasse diese vom hauptthread nacheinander in die datei schreiben

-oder-

hole dir den StreamWriter mittels File.AppendText(path)

-oder-

hole dir zunächst einen FileStream mit FileMode Append und setzte damit deinen StreamWriter auf
 
Hallo GrafZahl,

danke für die Hinweise, nach genau so etwas habe ich gesucht.

Zum Schreiben der Datei:
Code:
StreamWriter SW = File.AppendText(fileName);
SW.WriteLine(text);
SW.Close();

funktioniert wunderbar, danke.

Das Threadhandling werde ich mir später anschauen, da ich momentan leider keine Zeit habe.
 
eine sache vorweg:
schau dir mal System.Threading.WaitHandle an ... jeder deiner threads bekommt eins (z.B. ein Mutex), und muss es signalisieren (ReleaseMutex()) wenn der thread fertig ist...

wenn man aufs threadende warten möchte, kann man WaitForSingleObject() bzw. WaitForMultipleObjects() auch nen threadhandle geben. dafür gibt's sicher auch nen c#-wrapper.
 
Zurück
Oben