Hallo Community,
ich hoffe das hier ist das richtige Unterforum, ansonsten bitte verschieben.
Ich versuche einen asynchronen IP-Scanner zu programmieren und Frage mich nach einiger Recherche ob mein Vorgehen richtig ist. Ich habe das ganze vor einiger Zeit mal in PowerShell geschrieben (github.com/BornToBeRoot/PowerShell_IPv4NetworkScanner), hier jedoch mit einem RunspacePool und ohne UI
Der Benutzer hat die Möglichkeit eine IP-Adresse/Range/Subnetz einzugeben. Also z.B. 192.168.178.0/24... Davon erzeuge ich einen List, welche ich zu einem Array konvertiere da dieses ja schneller verarbeitet wird.
Danach starte ich einen Task (damit der UI Thread nicht blockiert wird) und arbeite mittels einer Parallel.Foreach() die IP-Adressen ab. Da Parallel.Foreach() mit der TPL arbeitet und auf den zugrundeliegenden ThreadPool zurückgreift (korrigiert mich bitte wenn ich hier falsch liege) habe ich die min / max Anzahl der gleichen Thread auf 256 (/24) erhöht.
Das Ergebis "IPScanResult" ist eine ObservableCollection die an ein DataGrid gebunden ist. Weil die ObseravleCollection nicht Thread Safe ist, habe ich 2 Möglichkeiten gefunden:
1)Mit Hilfe eines Lock Objects (This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread.)
2) oder mit dem Dispatcher (wie unten im Code gezeigt)
Seit .NET 4.5 gibt es ja auch noch den ConcurrentBag, welcher ThreadSafe ist aber von Haus aus kein INotifyPropertyChange unterstützt.
Ein Scan dauert gefühlt 4-5 Sekunden (ping timeout usw...) für ein /24 Subnetz.Was ich sehr akzeptabel finde.
Würded ihr den Code so lassen? Was könnte man optimieren?
Das Project / den kompletten Code findet ihr auch hier: github.com/BornToBeRoot/NETworkManager/tree/master/Source
Danke und viele Grüße
ich hoffe das hier ist das richtige Unterforum, ansonsten bitte verschieben.
Ich versuche einen asynchronen IP-Scanner zu programmieren und Frage mich nach einiger Recherche ob mein Vorgehen richtig ist. Ich habe das ganze vor einiger Zeit mal in PowerShell geschrieben (github.com/BornToBeRoot/PowerShell_IPv4NetworkScanner), hier jedoch mit einem RunspacePool und ohne UI
Der Benutzer hat die Möglichkeit eine IP-Adresse/Range/Subnetz einzugeben. Also z.B. 192.168.178.0/24... Davon erzeuge ich einen List, welche ich zu einem Array konvertiere da dieses ja schneller verarbeitet wird.
Danach starte ich einen Task (damit der UI Thread nicht blockiert wird) und arbeite mittels einer Parallel.Foreach() die IP-Adressen ab. Da Parallel.Foreach() mit der TPL arbeitet und auf den zugrundeliegenden ThreadPool zurückgreift (korrigiert mich bitte wenn ich hier falsch liege) habe ich die min / max Anzahl der gleichen Thread auf 256 (/24) erhöht.
Das Ergebis "IPScanResult" ist eine ObservableCollection die an ein DataGrid gebunden ist. Weil die ObseravleCollection nicht Thread Safe ist, habe ich 2 Möglichkeiten gefunden:
1)
2) oder mit dem Dispatcher (wie unten im Code gezeigt)
Seit .NET 4.5 gibt es ja auch noch den ConcurrentBag, welcher ThreadSafe ist aber von Haus aus kein INotifyPropertyChange unterstützt.
C#-Quellcode
- IPAddress[] ipAddresses = (await IPScanRangeHelper.ConvertIPRangeStringToListAsync(IPRange)).ToArray();
- ThreadPool.SetMinThreads(256, 256);
- ThreadPool.SetMaxThreads(256, 256);
- await Task.Run(() => Parallel.ForEach(ipAddresses, new ParallelOptions() { MaxDegreeOfParallelism = 256 }, ip =>
- {
- Ping ping = new Ping();
- PingReply reply = ping.Send(ip);
- if (reply.Status == IPStatus.Success)
- {
- // Add the items
- Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => IPScanResult.Add(new IPScanInfo(ip, reply.Status))));
- }
- }));
Ein Scan dauert gefühlt 4-5 Sekunden (ping timeout usw...) für ein /24 Subnetz.Was ich sehr akzeptabel finde.
Würded ihr den Code so lassen? Was könnte man optimieren?
Das Project / den kompletten Code findet ihr auch hier: github.com/BornToBeRoot/NETworkManager/tree/master/Source
Danke und viele Grüße
NETworkManager - A powerful tool for managing networks and troubleshoot network problems!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „BornToBeRoot“ ()