Announcement

Collapse
No announcement yet.

Hashtable synchronisieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hashtable synchronisieren

    Wie kann ich ein Objekt, in dem Fall eine Hashtable sperren, bis sie wieder freigegeben wurde?

    Ich habe 2 Threads, die beide auf diese HAshtable zugreifen, lesend und schreibend.

    Hoffe mir kann jemand helfen.

  • #2
    Hallo,

    hier kann das <b>lock</b>-Statement helfen. Das sorgt dafür, dass ein Objekt von nur einem Thread zugegriffen werden kann.
    <pre>
    lock(myHashtable) {
    <i>// Zugriff auf Hashtable</i>
    }
    </pre>

    Weitere Infos unter:
    ms-help://MS.NETFrameworkSDK/csref/html/vclrfLockStatement.htm

    Schöne Grüße

    Jör

    Comment


    • #3
      Hallo,

      einige Klassen aus dem .NET-Framework, die intern nicht threadfest sind (wie zum Beispiel ArrayList, Hashtable, Queue, SortedList, Stack, TextReader, TextWriter, RegEx usw.) stellen die statische Methode <b>Synchronized</b> zur Verfügung, die eine Threadsichere Objektinstanz zurückliefert. Das Problem liegt dabei in den Instanz-Daten dieser Klassen, die beim Zugriff aus mehreren Threads heraus auch für jeden Thread eindeutig sein müssen. Damit diese Klassen nicht immer im sicheren - aber auch langsameren - Modus laufen müssen, stellt das .NET-Framework diese spezielle Methode zur Verfügung. Über die Eigenschaft <b>IsSynchronized</b> kann der Aufrufer prüfen, in welchem Modus die Instanz gerade läuft.

      Ich habe "leider" nur ein VB.NET-Beispiel am Lager:
      <pre>
      Dim aHT As New System.Collections.Hashtable(10)
      ' Werte füllen
      aHT.Add("BRD", "Berlin")
      aHT.Add("Frankreich", "Paris")
      aHT.Add("Italien", "Rom")
      ' Synchronisierte (threadsichere) Hashtable anfordern
      Dim aSyncHT As System.Collections.Hashtable
      aSyncHT = System.Collections.Hashtable.Synchronized(aHT)
      ' Prüfen
      ListBox1.Items.Add(aHT.IsSynchronized.ToString())
      ListBox1.Items.Add(aSyncHT.IsSynchronized.ToString ())
      'Alle Wertepaare anzeigen
      Dim aDE As DictionaryEntry
      For Each aDE In aHT
      ListBox1.Items.Add(String.Format("Key {0} = Value {1}", aDE.Key, aDE.Value))
      Next
      </pre&gt

      Comment


      • #4
        Habt beide schönen Dank, hab es hinbekommen.
        Hab einfach die 2 Threads synchronisiet.
        Der eine Thread, der schreibender Weise auf die Hashtable zugreift, kann nur dann laufen, wenn der andere Thread im Moment steht (anhand Thread.Sleep), genauso umgekehrt. So hab ich ausgeschlossen, dass nicht beide Threads gleichzeitig auf die Hashtable zugreifen.
        Leider kam mir der Gedanke ein wenig spät.
        Habt trotzdem lieben Dank.

        MfG. Christian

        Comment

        Working...
        X