Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

C# Threading , Asynchrone Events und Datei lock

Diskussion: C# Threading , Asynchrone Events und Datei lock im Forum Code Kitchen, in der Kategorie Software Home; Anzeige Hallo Hackerboardler, in nachfolgendem Code versuche ich Pings asynchron zu senden und die Ergebnisse in zufällig generierte Dateien zu ...

Antwort
Alt 02.04.11, 00:17   #1 (permalink)
.:L
Senior Member
 
Benutzerbild von .:L
 
Registriert seit: 05.05.06
.:L Leistung: 8086
.:L eine Nachricht über ICQ schicken
Likes: 22
Standard C# Threading , Asynchrone Events und Datei lock

Anzeige

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

__________________
fat people are hard to kidnap
.:L ist gerade online   Mit Zitat antworten
Alt 02.04.11, 02:22   #2 (permalink)
 
Registriert seit: 05.10.05
Inliferty Leistung: 8086
Inliferty eine Nachricht über ICQ schicken
Likes: 5
Standard

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
Inliferty ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 02.04.11, 10:24   #3 (permalink)
.:L
Senior Member
Themenstarter
 
Benutzerbild von .:L
 
Registriert seit: 05.05.06
.:L Leistung: 8086
.:L eine Nachricht über ICQ schicken
Likes: 22
Standard

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
__________________
fat people are hard to kidnap
.:L ist gerade online   Mit Zitat antworten
Alt 02.04.11, 12:20   #4 (permalink)
Member of Honour
 
Benutzerbild von GrafZahl
 
Registriert seit: 28.05.10
GrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: OpteronGrafZahl Leistung: Opteron
Likes: 210
Standard

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:

Zitat:
Zitat von Konstruktor der StreamWiriter-Klasse
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
__________________
Code:
:(){ :|:& };:
Veritas Aequitas
GrafZahl ist offline   Mit Zitat antworten
Alt 02.04.11, 13:30   #5 (permalink)
.:L
Senior Member
Themenstarter
 
Benutzerbild von .:L
 
Registriert seit: 05.05.06
.:L Leistung: 8086
.:L eine Nachricht über ICQ schicken
Likes: 22
Standard

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.
__________________
fat people are hard to kidnap
.:L ist gerade online   Mit Zitat antworten
Alt 04.04.11, 00:13   #6 (permalink)
 
Registriert seit: 28.07.08
ArnoNühm Leistung: Z3
Likes: 1
Standard

Zitat:
Zitat von GrafZahl Beitrag anzeigen
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.
ArnoNühm ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Software Home » Code Kitchen » C# Threading , Asynchrone Events und Datei lock
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61