Threading - maximal X Threads starten/beobachten/neustarten

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von high152.

    Threading - maximal X Threads starten/beobachten/neustarten

    Hi,

    ich hab vor eine bestimmte Anzahl X an Threads zu starten und falls einer dieser Threads beendet ist, soll ein neuer Thread gestartet werden, aber nur so, dass maximal immer X Threads gestartet sind.

    Um es genauer zu sagen möchte ich, einen kleinen Downloadmanager für die Erfahrung schreiben, sonst würd ich gleich selbst JDownloader oder sowas benutzen.
    Ich möchte einstellbar max X gleichzeitige Downloads laufen lassen und mir aus jedem Thread die Geschwindigkeit an die Form ausgeben.


    Nun meine Probleme:

    - wie soll ich diese Threads beobachten, ich ja will meinen HauptThread nicht dauerhaft besetzen, gäbe es da nur die Möglichkeit eines Timers/neue Threads in Extra Thread starten+überwachen?

    - ich habe eine Reihe an Aufgaben im HauptThread: soll ich die Threads mit jeweils einer Aufgabe starten oder sie aus einer Threadsicheren Queue/Stack (bspw. ConcurrentQueue) die Aufgaben abrufen lassen?

    - ich möchte sicher gehen, dass sich nicht einer meiner Threads aufhängt, da sie mit dem Internet verbunden sind. Könnte ich das mit einem Timestamp regeln der überprüft wird und nach einer bestimmten Zeit wird der Thread abgebrochen?

    - ich möchte in der Form eine Information einblenden, die erst in den Threads berechnet wird, doch wie komm ich vom inneren der Threads an die Form?


    Also ehrlich gesagt hab ich momentan noch keine Idee wie ich das anstellen sollte.
    Die Schwierigkeit für mich liegt vor allem darin, dass ich nicht weiß wie ich das Regeln soll, dass mehrere Threads an derselben Aufgabe arbeiten bis sie erledigt ist.


    Danke schonmal im Voraus für Hilfen!
    Warum verwendest du nicht einfach die Asynchronen Methoden des WebClient?
    Und mMn würde sich da eher empfehlen, dass wenn ein Download beendet wird, derselbe Thread auch mit der nächsten aufgabe weiter macht, denn sonst haste unnötige Thread erstellerei...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    grad beim Downloaden kann man die Geschwindigkeit vervielfachen, wenn man mehrere uris gleichzeitig abruft. Also mitte asynchronen Methoden liegsteda goldrichtig.

    also mittm webclient .BegindDownload aufrufen - hats da nicht auch Events ProgressChanged? ich kenn mich mit dem Zeug nicht so super aus, und bin auch zu faul, jetzt eben im ObjectBrowser/ObjektKatalog nachzugucken, das kann der TE ruhig selber machen ;)
    Jap es gibt so ein ProgressChanged-Event beim WebClient!

    Ich glaube aber nicht das mit einen WebClient mehrere Downloads laufen lassen kann!

    Ich würde da zb 5 WebClients deklarieren und die Liste der Downloads mit ner Schleife durchmachen...
    Sobald der WebClient die Datei fertig hat, soll er den nächsten offenstehenden Download beginnen... usw...

    Würde ich so zumindest machen:)
    OK, dann verwende ich statt Timern oder sowas lieber Events, macht mehr Sinn.

    Und das mit den Threads hätte ich eigentlich auch noch wissen müssen, dass es sehr ressourcenaufwendig ist, aber gut das nächste mal denk ich nochmal nen Tag drüber nach bevor ich nen Thread aufmach^^.

    Mit Async-Funktionen hab ich mich bis jetzt noch gar nicht beschäftigt, schau mir das alles mal an mit dem WebClient, danke schonmal!