IP-Verwaltung mehrere Threads

12/07/2016 12:01 xTrion#1
Hallo Leute,

ich habe eine große Liste mit IP-Adressen um diese auf Ihre Verfügbarkeit zu testen, Pinge ich diese nacheinander an.
Da jedoch die Liste mehr als 600 Einträge hat dauert dieser Vorgang sehr lange.
Um die Bearbeitungszeit zu verkürzen wollte ich die Funktion in mehreren Threads ausführen. Das Problem war jedoch, dass die
Funktion zwar mehrmals aufgerufen wurde, aber von den Threads die selbe IP bearbeitet wurde. Ich habe mal schnell die Logik
zusammen geschrieben, da ich zurzeit keinen Zugang zu meinem Code habe.

Ich wäre über Lösungsvorschläge sehr dankbar.
Code:
Button_Click Logik
	//Aktuell mit einem Thread
	Thread th = new Thread(new ThreadStart(checkProxy));
	th.start();
	//Erster Versuch, welcher jedoch nicht das gewünschte Ergebniss lieferte.
	Thread th = new Thread(new ThreadStart(checkProxy));
	Thread t = new Thread(new ThreadStart(checkProxy));
	th.start();
	t.start();

checkProxy Logik:
	int Count = Listbox.Items.Count();
	int Curr = 0;
	int Timeout = 5000;
	while(Curr < Count)
	{
		string IP = (string)Listbox.Items[Curr];
		Ping p = new Ping();
		PingReply pr = p.send(IP, Timeout);
		if(pr.status == IPStatus.Success) {
			//Hier wird die IP in 2. Listbox eingefügt
			updateBox(Listbox2, IP)
			//Hier wird die IP aus der 1. Listbox entfernt
			deleteItem(Listbox, IP)
		} else {
			//Hier wird die IP aus der 1. Listbox entfernt
			deleteItem(Listbox, IP)
		}
		Count = Listbox.Items.Count()
                Curr++;
	}
Grade erst gemerkt das ich das ganze im falschen Bereich gepostet habe. Wäre gut wenn jemand das nach .Net verschieben könnte. Danke.
12/07/2016 14:43 Devsome#2
#moved
12/07/2016 17:47 bloodx#3
bist du sicher dass der Code auch so aussieht ? weil Sie können theoretisch nicht die gleiche IP bearbeiten da du sie ja aus der List entfernst.

Ich weis ja nicht wie C# das handhabt aber sicher ist das Thread Handling ja nicht grade ? gleichzeitiger Zugriff auf die Sachen ohne Synchronisation ist nicht so optimal.
12/07/2016 19:17 warfley#4
1. Du hast keine Sperren verwendet
2. Du löschst den Eintrag erst nach dem Ping, solange der Ping läuft kann jeder andere thread auf das selbe zugreifen, und so ein Ping dauert lange
3. Warum greifst du überhaupt auf die Listbox zu.

Am besten Kopierst du für jeden Thread alle Relevanten einträge, somit müssen die Threads nicht auf geteilten Speicher zugreifen. Ansonsten solltest du Sperren verwenden wenn du auf geteilten Speicher zugreifst.

Noch was am rande, eine Listbox möchte die ganze Zeit neu Zeichnen wenn du die Einträge bearbeitest, das zieht unnötig leistung, also entweder arbeite nicht direkt auf der Listbox oder verwende Begin- bzw Endupdate

[Only registered and activated users can see links. Click Here To Register...]
12/16/2016 14:27 #Saiirex#5
Du könntest auch Parallel.For bzw ForEach nutzen.