Threads Hören auf zu arbeiten

  • VB.NET
  • .NET (FX) 4.0

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Threads Hören auf zu arbeiten

    Hi,
    Ich lasse einen thread x mal starten, aber nach 1479 mal hört das ganze auf und die threads zählen runter, obwohl ich noch viel mehr habe. Die message box erscheint übrigens auch nicht.
    Code:

    VB.NET-Quellcode

    1. Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    2. For i = 0 To proxylist.Count - 1
    3. GG:
    4. If Threads >= TrackBar1.Value Then
    5. Threading.Thread.Sleep(1000)
    6. GoTo GG
    7. Else
    8. Dim th As New Threading.Thread(AddressOf threadwork)
    9. th.Start(proxylist(i))
    10. Threads += 1
    11. End If
    12. Next i
    13. MsgBox("Alles durch!")
    14. End Sub
    15. Private Sub threadwork(ByVal Proxy As String)
    16. Dim splitted() As String = Proxy.Split(":"c)
    17. Dim d As New Net.WebClient
    18. Dim i As Integer = splitted(1)
    19. Try
    20. d.Proxy = New WebProxy(splitted(0), i)
    21. Dim dd As String = d.DownloadString("http://xx/test.txt")
    22. If dd = "Testme" Then
    23. good += 1
    24. goodlist(goodlist.Count - 1) = Proxy
    25. ReDim Preserve goodlist(0 To goodlist.Count)
    26. Else
    27. bad += 1
    28. End If
    29. Catch ex As Exception
    30. errorr += 1
    31. End Try
    32. Threads -= 1
    33. End Sub

    Danke
    Wer Rechtschreibfehler findet darf sie behalten :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „joniator“ ()

    wtf. Was willst Du damit eigentlich erreichen, wenn Du einen Thread so oft startest?
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hmpf, Artentus hat das nicht nur für's Testen der Forumsfunktionen verlinkt. Beispiel ansehen, auf den eigenen Code übertragen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Viele Threads starten ist alles andere als Ressourcenschonend und soviel ich weiß auch begrenzt. Für solche Aufgaben wie die deinen gibt es den Threadpool und seit .NET 4.0 auch die darauf aufsetzenden Tasks.
    Hat man jedoch größere Datenmengen oder Operationen des gleichen Typs welche man abarbeiten will, gibt es seit .NET 4.0 die Parallel-Klasse. Diese ist für solche Dinge optimiert.
    Dies wäre für dich garantiert die zu bevorzugende Variante:
    c-plusplus.de/forum/269193 Teil 1
    c-plusplus.de/forum/270799 Teil 2

    http://msdn.microsoft.com/de-de/library/dd537608(v=vs.110).aspx

    Nebenbei bemerkt: Man sieht heutzutage selten so einen ranzigen Code. ReDim, Goto,... schreib den Mist neu. Damit wirst du nieeemals glücklich.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.

    joniator schrieb:

    VB.NET-Quellcode

    1. GoTo GG
    Ab welchem Framework gibt es diesen Befehl :?:
    Den kenne ich nämlich nicht. :thumbsup: :thumbsup: :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Du könntest einmal versuchen eine Feste Anzahl von Threads (z.B. 10 Threads) zu setzen. Dann kannst du die Liste mit deinen Proxy -IP´s in z.B. 10 List<of string> Listen aufteilen.
    Nun hast du 10 Listen, für jede Liste startest du nun einen Thread, der Thread arbeitet dann die liste ab. Damit sollten deine Probleme schon gelöst sein. Falls dein Projekt auf dem .NetFramework 4.0 aufbaut dann solltest du wie schon geschrieben wurde deine Threads noch in einen Threadpool packen damit du sie leichter verwalten kannst.


    Bei deiner Proxy Validierung kannst du auch noch einiges rausholen. Im Namespace System.Net befindet sich unter anderem auch System.Net.NetworkInformation dieser Namespace wiederum ermöglicht es einen Server einfach anzu pingen.

    Könnte in VB ungefähr so aussehen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Shared Function IsProxyAlive(ProxyIP As String) As Boolean
    2. Try
    3. Dim ping As New Ping()
    4. Dim replay = ping.Send(ProxyIP)
    5. If replay.Status = IPStatus.Success Then
    6. Return True
    7. Else
    8. Return False
    9. End If
    10. Catch ex As Exception
    11. System.Windows.Forms.MessageBox.Show("Es ist ein Fehler bei der Proxy validierung aufgetreten!" + Environment.NewLine + ex.Message, "ERROR", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error)
    12. Return False
    13. End Try
    14. End Function

    Diese Idee ist Ranz, dafür gibt es modernes Zeugs, wie parallele For-Schleifen.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Begründung dafür?

    Edit:

    Hab nun beide Varianten versucht (meine List 50 Proxys).

    Sowohl bei meiner Variante als auch mit System.Threading.Task.parallel.
    Bei beiden varianten benötigt die abfrage 20 sek.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    Fakiz schrieb:

    die abfrage 20 sek.

    Du sagst es. DIE Abfrage benötigt 20 Sekunden. Was mir übrigens als sehr lange erscheint.

    Außerdem ist ein Ping um Proxies zu überprüfen nur suboptimal. Da wir hier von WebProxies sprechen, basieren diese Proxies auf Layer 4 Protokollen. Da Ping das ICMP verwendet welches ein Layer 3 Protokoll ist, kannst du da nichtmal auf offene Ports überprüfen bzw. auf laufende Dienste überprüfen.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Hmpf, 20 Threads zu erstellen ist einfach kein gutes Designing.
    Abgesehen davon, dass Threads extrem viel Ressourcen beschlagnahmen, alternativ gibt es ThreadPools und normale Tasks.

    Außerdem scheint mir die Aussage, dass es mit Parallel.For nicht so schnell geht nicht real, denn es arbeiten einfach mal mehr GHz des Prozessors.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Aber was ist schneller und einfacher hinzuschreiben? Richtig, die Parallel.For-Variante.
    Ausserdem hat Pallel.For noch weitere Vorzuege, so werden immer genau so viele Threads verwendet, wie die CPU gleichzeitig verarbeiten kann, nicht mehr. Bei normalen Threads ist nichtmal gewaerleistet, dass sie immer auf dem selben logischen Kern laufen. Zudem lassen sich Parallel.For-Schleifen beliebig schachteln, one dass sich daran etwas aendert.