Multithreading Einstieg

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von hal2000.

    Multithreading Einstieg

    Hallo liebe VB Paradise Gemeinde,

    ich fange grade an mich in VB mit dem kompliziertem Multithreading zu beschäftigen. In diesem Rahmen habe ich mir ein kleines Projekt ausgedacht und komme mit folgenden Punkten nicht klar, wozu ich auch nichts im Internet gefunden habe:

    - Variablenzugriffe
    - Datenbankzugriffe

    Ich habe ein Programm was eine URL Liste hat in einem Array. Diese Liste wird mit dem Webclient abgearbeitet indem der Quellcode der HTMLs runtergeladen wird. Diesen Prozess erhoffe ich mir zu verschnellern. Daher folgende Fragen muss ich für jeden parallelen download einen neuen Thread schreiben? Wie können die einzelnen Threads auf das Array zugreifen? Oder ist es hier schlauer die jeweilige URL zu übergeben?

    Und wie speichere ich die gewonnen Daten am besten ab? Eine Datenbankverbindung zu Access kann die parallel beschrieben werden? Vielleicht hat jemand ja sogar etwas Beispielcode.
    Viele Fragen. :D
    1. Multithreading ist nicht kompliziert, weil Du es kompliziert nennst, es ist nicht kompliziert, wenn Du es kannst. :D
    2. Beschreibe bitte genau, was Du willst. Nicht für jeden Download eine eigene Klasse schreiben, sondern eine Klasse für ein (Multi-)Download schreiben.
    3. Gleichzeitig iein Download durchführen? Ja, übergib die URL; gugst Du hier.
    4. Nimm kein Array, nimm eine List(Of T). Pack das Befüllen des Arrays in eine entsprechende Property mit Semaphore.
    5. Kapsle alles, was sich iwie kapseln lässt, in einer separate Klasse und übergib deren Instanz an die anderen Klassen, die sie benötigen.
    6. Nutze Properties, nicht aber Public Variablen, im Setter kann man da noch einiges reinpacken.
    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!
    Alle Downloads gleichzeitig durchzuführen muss nicht unbedingt die beste Möglichkeit sein, sie könnten sich gegenseitig auch ausbremsen. Am besten du legst einfach einen Thread an, der alle Downloads der Reihe nach abarbeitet. Oder noch besser, da der WebClient ja sowieso schon asynchrone Methoden besitzt, kannst du dir das Threading auch komplett sparen und einfach immer im DownloadCompleted-Event den nächsten Download starten.
    Und solange du nur lesend auf Variablen zugreifst, solltest du dir über Threadsicherheit keine Gedanken machen müssen.
    MultiThreading ist vom Prinzip her einfach: manche Methoden werden halt gleichzeitig abgearbeitet.

    Was sich allerdings daraus ergibt, ist ein doch erheblicher Rattenschwanz an Fußfallen.
    Die vom Prinzip her einfach da her rühren, dass Parallelität auch bedeutet, dass u.U. etwas noch nicht fertig ist, wenn es woanders aber schon gebraucht wird. 8|

    Und Oberflächen dürfen nur und ausschließlich aus demselben Thread aufgerufen werden, also muß ein Mechanismus gefunden werden, wie man den Gui-Zugriff aus dem Neben-Thread wieder zurück-delegiert an den Haupt-Thread.
    Auch nervig, dass der User womöglich mehrmals auf denselben Button drückt, und dadurch mehr Threads als nötig auslöst...

    du siehst: prinzipiell einfach, aber Teufel im Detail.

    Ein Rundumschlag zum Thema: AsyncWorker - CodeProject