C# Get active Thread.

Nyxero

Cadet 4th Year
Registriert
Jan. 2015
Beiträge
105
>Warnung, kann etwas Zeitaufwendig sein<

Hallo liebe Community.

Ich bin gerade in der Entwicklung eines Projekts und komme einfach nicht weiter.
Um das Projekt zu verstehen lest am besten dies: https://github.com/Nyxero/IPv4_Analyse/blob/master/README.md

Dort ist das Ziel genau beschrieben. Den momentanen SourceCode wo ich ein Problem habe, findet ihr hier:
https://github.com/Nyxero/IPv4_Analyse/blob/master/Creat_IPv4List_v0-5.cs

So wenn jetzt noch jemand übrig geblieben ist, mein Problem:
Das Problem ist in der Methode "Fill_List".
Ich habe dort mehrere Threads (nach usereingabe) in ein Array erstellt und der Methode zugewiesen.
Ich weiß auch schon welcher Thread welche Files füllen soll. Das siehst man an dem super tollen provisorischen
double Array "lol". Daher weiß ich schon mal in welcher Position die verschiedenen Threads anfangen müssen die Files zu Füllen (und bis welche Position).

Das kann ich alles super abgleichen mit "strFileNames", dementsprechend ist das ansprechen der Files auch kein Problem.

Jedoch brauche ich die aktive Thread nummer (bzw die Position im Array) um die "shTreadNumber" mit "lol" und "strFilesNames" abgleichen zu können.

Wenn ich diese Position hätte, könnte ich den Rest der Methode zuende schreiben.
Ich habe natürlich schon gegoogelt leider war ich nicht so siegreich. Vielleicht kann mir jemand von euch helfen
und hätte eine Idee wie ich an die Position komme.

Ich weiß der Source Code ist nicht gerade sauber und "Creat_Threads" ist wegen den Argumenten auch nicht so geil. Trotzdem möchte ich gerne das die Kommentare sich bitte auf die Frage beziehen!

Ich bedanke mich bei jeder hilfreiche Antwort schon einmal im vorraus :freak:.
 
Zuletzt bearbeitet:
Thread.CurrentThread. Ansonsten könntest du das auch einfach dem Thread per Parameter mitgeben.


Dauert eines Ping: 5 Sekunden.
Das ist aber eine ziemlich gigantische Latenz.

Dadurch merkt die Anwendung ob die IP-Adresse öffentlich zugänglich ist oder nicht (eine Antwort oder nicht).
Falsch, ein nicht zurückgeschicktes ICMP Paket sagt nicht aus, dass eine IP nicht öffentlich ist, sondern höchstens, dass dort nichts auf dein ICMP Paket antworten möchte.
 
Zuletzt bearbeitet:
Naja, ist überall unteschiedlich. Habe einfach damit gerechner.
In der Firma habe ich mit der StopWatch Klasse 1,5s abgelesen.
Bei mir zuhause waren es dann 5s (ich bin auch im W-Lan).

Ja das ist mir auch schon aufgefallen. Als ich Microsoft.com anpingen wollte.
Sollte ich evtl. korrigieren.

Danke für den Tipp werde ich bei Gelegenheit ausprobieren.
Habe dafür jedoch jetzt gerade keine Zeit.
 
Zuletzt bearbeitet:
Die üblichen Paketumlaufzeiten zu Servern in der "Nähe" (z.B. innerhalb des gleichen Landes) sind in der Regel deutlich unter 100ms.

Da kommen mir deine 1,5s oder gar 5s sehr, sehr groß vor - auch WLAN ändert daran nichts.
 
Ich kann auch nicht genau sagen warum das so lange dauert.
Ich habe es einfach gestopt. Evtl. ist die Ping Methode nicht gerade die tollste.

Ihr könnte es bei gelegenheit ja selber mal Testen. Wenn ich mit der CMD pinge, komme ich auch auf 110 ms oder so ähnlich.

Mir ist es auch ein rätsel warum der Ping da solange dauert. Dies nachzustellen dauert ja nicht lange.
Könnt eure Ergebnisse ja mal Posten für ein Vergleich :)
 
Zuletzt bearbeitet:
Unbenannt.png
 
Ähhm bevor ihr hier noch länger sucht: RTFM^^, RoundtripTime ist in ms. https://msdn.microsoft.com/de-de/library/system.net.networkinformation.pingreply(v=vs.110).aspx

​Falls du das komplette IPv4-Netz scannen willst, dafür gibt es Lösungen, die machen das in 10 Minuten (10 Gb/s Netzwerk vorausgesetzt).

​Falls du es selbst programmieren willst:

​Fang gar nicht erst mit 1 Thread <=> 1 Ping an, das skaliert gar nicht. ​Eher 1 Thread <=> n Pings. Und am besten sind die alle noch unterwegs, also komplett asynchron. Lass den Thread so viele Pings wie möglich senden und wenn dann ein Reply kommt, werte den aus. Dabei solltest du Verluste mit einbeziehen (5 Wiederholungen wird häufig verwendet). Weil Pings "UDP" sind, solltest du auch nicht zu schnell senden (so maximal 90 % der Bandbreite für Pings verwenden bzw. dynamisch auf Packet Drops reagieren).

​Für die Datenspeicherung: Nehm eine Datenbank, ist auch für die Auswertung viel eleganter. Mit LINQ sollte das nicht zu kompliziert sein.
 
Vielen dank für die Tipps, ich werde sie mir zuherzen nehmen und versuchen zu realisieren.
Und Ja ich mache das ganze um mich mit den Themen zu beschäftigen und um das Programmieren zu üben
(neue Klassen kennen zu lernen).

Dementsprechend kommt für mich sollch ein Tool nicht in frage. Ich möchte es einfach mal selber machen ;)
Trotzdem danke für den Hinweis.

Zuerst werde ich die Algorithmen fertig schreiben.
Dann werden ich schauen warum der Ping bei mir so lange dauert
und zu guter letzt werde ich das ganze etwas umplanen und auf verbesserungen eingehen.

Nachtrag: Es war nie geplant das 1Thread nur 1x Pingt. Es wird die Anzahl an IP-Adressen durch die Threads geteielt.
 
Zuletzt bearbeitet:
Du hast bei den Pingzeiten wohl einfach die stopwatch falsch genutzt oder irgendwo vergessen was zu teilen, wenn du zb. Mehrere pings zusammen nimmst um die Genauigkeit zu erhöhen.
 
Hallo,

ich habe dir mal aus Langeweile ein kleines Projekt angehängt. Da du ja geschrieben hast, dass du weitere Klassen kennen lernen möchtest, habe ich mal den Kern asynchron programmiert. Das heißt, ich habe Tasks statt Threads benutzt. Dies hat den Vorteil, dass du keine Threads (Ressourcen) blockierst und das Framework sich um die Threadsache kümmert. Bei Interesse / Bedarf kannst du es dir ja anschauen.

Gruß
 

Anhänge

Wunderbar!
Ich bin gerade zu erschlagen von den vielen und hilfreichen Antworten.

Vor allem die Qualität der Antworten erstaunt mich. Ich bin es gewohntin Foren wegen meiner Unwissenheit auseinander geglückt zu werden.

Also an der Stelle nochmal ein großes dankeschön. Ich werde mir dein Vorschlag auf jeden Fall anschauen.

Bin schon eine Ecke schlauer. Und ich denke ich muss etwas umplanen.

Nochmal zu dem Thema Ping: Ich weiß jetzt wie ich auf diese Zeiten kam. Ich habe kein Time out Zeit angegeben. Der Standarte scheint da ziemlich hoch angesetzt zu sein.
 
Irgendwo muss man Anfangen, ist noch kein Meister vom Himmel gefallen.
Finde das Projekt gut, über den Praktischen nutzen kann man streiten, aber es sollte eine gute Übung sein und bietet ausreichend Potenzial für spätere Verbesserungen (Multithreading, Datenbanken).

Ein Tipp, du brauchst keine Versionsnummer im Dateinamen, das macht Versionscontrolle mit Git nur komplizierter.
Einfach ausgedrückt legt Git schon automatisch für jeden Commit eine Revision an, damit kannst du also jederzeit zurück zu alten Versionen.
Für Meilensteine kannst du dann auch GitHub Tags oder Releases benutzen.
 
Zurück
Oben