Dictionarys und Threads

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Manus.

    Dictionarys und Threads

    Hi,
    ich habe folgendes Problem:
    Ich habe ein Programm in dem ich bestimmte Daten in einem Dictionary of Objects abgelegt habe die laufend vom Hauptthread aufgerufen werden zur Darstellung in der Form. Da die Berechnung dieser Objects nun dauert wollte ich das hinzufügen dieser Objects zur Laufzeit in einem eigenen Thread auslagern.

    Gesagt getan, nur führt das nun zu Problemen, wenn ein neues Object in das Dictionary eingefügt werden soll. Dann hängt sich nämlich das Programm stumpf auf.

    Wühlen in Google brachte da mehrere Ergebmisse, z.B. Lock, Mutex, Interlock aber nicht wirklich eine Erklärung was man davon am besten nutzt und wieso.

    Entsprechen die Frage, ob jemand das schon mal gelöst hat und wenn ja was man davon am besten nutzen kann und wo man da ein vernünftiges Beispiel dafür finden kann.
    @Manus Kannst Du das Projekt ohne Binaries (bin, obj) mal anhängen?
    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!
    Konkurrenz ist kein einfaches Thema.

    Wühlen in Google brachte da mehrere Ergebmisse, z.B. Lock, Mutex, Interlock aber nicht wirklich eine Erklärung was man davon am besten nutzt und wieso.


    Es gibt viele! Nur bestimmt sind sie lang und "kompliziert" und nicht die knackige schnelle Antwort, die dein Problem löst. Aber leider so geht die Sache mit dem Programmieren lernen....lesen, lesen und wenn fertig bist, weiter lesen und dann...? Ah ja testen....und.....lesen....

    Viele Wege führen nach Rom, aber jeder Weg hat seine eigene Diebe.

    Such in Google nach Concurrent collections, Threading and Parallelism.

    Man kann dir bestimmt helfen und dein Problem lösen, aber das ist Hunger für morgen...

    Besser man setzt sich mit das Thema auseinander, man versteht was abgeht und kann man dann entscheiden, welche der beste Weg für die jeweiligie Aufgabe ist bzw sein könnte.

    Eine gute Quelle sind die Bücher C# Step by Step and VB Step by Step von Microsoft. Findest du als PDF in Google und mMn die Erklärung dieses Themas ist gut. Auch das Buch (auf Deutsch), die hier oft im Forum erwähnt wird (weiss leider grad Name nicht)
    Life doesn't give you a datasheet. Sometimes the docs are wrong and you have to try it.

    Manus schrieb:

    wenn ein neues Object in das Dictionary eingefügt werden soll. Dann hängt sich nämlich das Programm stumpf auf.


    Wie äußert sich das? Fehlermeldungen?

    Das hinzufügen wird wohl weniger Zeitintensiv sein. Zeig uns den relevanten Code, dann kann man auch helfen.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Manus schrieb:


    Wühlen in Google brachte da mehrere Ergebmisse, z.B. Lock, Mutex, Interlock aber nicht wirklich eine Erklärung was man davon am besten nutzt und wieso.

    Entsprechen die Frage, ob jemand das schon mal gelöst hat und wenn ja was man davon am besten nutzen kann und wo man da ein vernünftiges Beispiel dafür finden kann.


    Ja, und zwar die Entwickler des .NET Frameworks (unter anderem). Verwende einfach die ConcurrentDictionary Klasse, wenn du threadübergreifend auf ein Dictionary zugreifen willst. Natürlich kann man das auch manuell mit SyncLocks lösen, aber wozu das Rad neu erfinden?
    Alternativ kannst du das Berechnen der Werte ja vom Zufügen ins Dictionary trennen.
    Berechnen nebenläufig machen - zufügen in den MainThread delegieren.
    Mit Await/Async wäre das super-elegant abzuhandeln - du bräuchtest nur 2 Zeilen umstellen - zusätzlicher Code würde garnet entstehen.

    Im Grunde ist dein Fall genau das Beispiel, an dem ich mein englisches Async-Tut aufgehängt hab - Zitat: "Assume a long lasting loading of Data, for exampte this..."