Laden...

Reader- und Writer-Thread synchronisieren

Erstellt von mirrowwinger vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.035 Views
M
mirrowwinger Themenstarter:in
81 Beiträge seit 2010
vor 13 Jahren
Reader- und Writer-Thread synchronisieren

Hallo c#-community,

habe wieder eine Frage. Ich habe eine Routine geschrieben, die aus bestimmten Webseiten (unbekannte Anzahl) Informationen entnimmt und diese in einer Liste zusammenstellen soll. Jede Website wird aufgrund der Performance in einer entsprechenden (auch unbekannten) Anzahl an Threads verarbeitet. Jetzt komme ich zu dem Problem: Ich schreibe alle Informationen in eine StringCollection (AddRange) und hier passiert es, dass ein Thread gerade noch in die StringCollection schreibt und ein weiterer gerade auf ihn zugreifen möchte. In der Console lasse ich mir das Ergebnis zum Test anzeigen und sehe dort, dass in diesem Fall die Informationen aus dem ersten zugreifenden Thread einfach abgeschnitten werden. Jetzt würde ich gern die erfahrenen mal fragen, wie ich das Problem so lösen kann, dass der 2. Thread (und alle anderen) bis der erste Thread mit dem Schreiben in die StringCollection fertig ist?

Vielen Dank
mirrowwinger

2.891 Beiträge seit 2004
vor 13 Jahren

Entweder du benutzt die lock-Anweisung (Threadsynchronisierung) oder du nimmst eine SynchronizedCollection<T>.

Gruß,
dN!3L

M
mirrowwinger Themenstarter:in
81 Beiträge seit 2010
vor 13 Jahren

Hmm sehe gerade eine Information habe ich in meinem Startbeitrag vergessen: Die Übergabe der Einzellisten aus den Threads erfolgt bei mir per Event. Kann man dort auch lock verwenden?

2.298 Beiträge seit 2010
vor 13 Jahren

Du musst doch nur die Zugriffe auf dene StringCollection Locken.

Das bedeuted, immer wenn du in die Collection schreibst:


lock(_myStringCollection)
{
     _myStringCollection.AddRange(whateveruwant);
}

Und immer wenn du aus der Collection liest:


lock(_myStringCollection)
{
    foreach(String myString in _myStringCollection)
    {
          // do whatever u want with the string
    }
}

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

S
902 Beiträge seit 2007
vor 13 Jahren

Hallo,

ich würde einen ReaderWriterLockSlim verwenden, da damit optimaler der lesezugriff geregelt wird.

mfg
serial

1.134 Beiträge seit 2004
vor 13 Jahren

Wenn du .net 4 nutzt kannst du auch eine der ThreadSafe Collections verwenden

z. Bsp.: ConcurrentDictionary<T>

s. z.bsp. http://stackoverflow.com/questions/1949131/net-dictionary-locking-vs-concurrentdictionary

vielleicht reicht auch eine BlockingCollection oder ein ConcurrentBag?

s.a. MSDN Concurrent Collections

Mein Stackoverflow Profil
Skype Name : Boas.Enkler (bitte einen hinweis in der Kontaktanfrage damit ich euch vom Spam unterscheiden kann)

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo mirrowwinger,

klassischer Anwendungsfall für SyncQueue <T> - Eine praktische Job-Queue.

Auch wenn einem die SyncQueue die meiste Synchronisierungsarbeit abnimmt, beachte trotzdem unbedingt die Hinweise, was für vertrackte Szenarien bei der Thread-Synchronisation auftreten können. Man sollte keinesfalls "mal eben" rumsynchronisieren, sondern sich in die Thematik erst gründlich einlesen, bevor man sich an Multithreading wagt. Anfangen kannst du hier: [Artikel] Multi-Threaded Programmierung.

herbivore