Übergeben von Daten zwischen Threads in c #

8

Ich habe einige Fragen zu meinem Problem gefunden, aber trotzdem konnte ich nicht alleine damit fertig werden, also werde ich versuchen, hier nachzufragen. Ich werde den Code einfügen, damit ich es leichter erklären kann.

%Vor%
  • Ich hätte gerne einen Zugang von der Methode StartCalculation, die in einem anderen Thread gestartet wurde. Ich möchte auf diese Liste von Form1 zugreifen (10 Elemente nach 10 Sekunden, 20 Elemente nach 20 Sekunden und so). Ist das möglich?
  • Wäre es möglich, eine Liste in Form1 () zu erstellen und dann in StartCalculation zu ändern? Danke für die Antworten:)

Bearbeitet für Groo- / -

%Vor%

Ich mache ein Spiel Bot. Ich möchte, dass der Speicher des Spiels in einem anderen Thread gelesen wird (Speicherliste ändern), und dann möchte ich mit wenigen anderen Methoden (in verschiedenen Threads) aus dieser Liste lesen und Spielaktionen abhängig von den Speicherwerten ausführen. Es funktioniert (oder scheint es nur zu sein), aber wenn Sie sagen, dass es unsicher sein könnte, möchte ich es auf Nummer sicher gehen.

Ich hoffe, ich habe mich nicht selbst zum Narren gemacht, indem ich es hier eingefügt habe.

    
Patryk 25.01.2012, 07:53
quelle

2 Antworten

19

Sie benötigen eine Form eines Synchronisationsmechanismus, um Objekte zwischen mehreren Threads zu ändern. Wenn Sie keine spezialisierte threadsichere Sammlung verwenden (diese sind in .NET 4 verfügbar), müssen Sie sich mit einem Monitor sperren.

Normalerweise ist ein geeigneterer Sammlertyp für das Erzeuger / Verbraucher-Muster ein Queue (eine FIFO-Sammlung) anstelle von List :

Einfache Warteschlange mit expliziter Sperrung

%Vor%

Und im Consumer-Thread müssen Sie das Element abrufen und verarbeiten:

%Vor%

Beginnend mit .NET 4 gibt es eine ConcurrentQueue<T> Sammlung, einen Thread- Safe FIFO, das beim Zugriff darauf die Sperre aufhebt und den Code vereinfacht:

GleichzeitigeQueue

%Vor%

Wenn Sie möchten, dass Ihr Consumer-Thread in regelmäßigen Abständen Elemente in Chunks erhält, ändern Sie dies wie folgt:

ConcurrentQueue mit Schwellenwert (10 Sek. oder 10 Elemente)

%Vor%

Dieses Muster ist so nützlich, dass es gut ist, es zu einer generischen Klasse zu abstrahieren, die das Erzeugen und den Konsum von externem Code delegiert. Es wäre eine gute Übung, es generisch zu machen.

Sie benötigen auch eine Stop -Methode, die wahrscheinlich ein volatile bool -Flag setzt, um anzuzeigen, dass es Zeit ist zu stoppen, und dann das Signal setzt, um den Verbraucher wieder zu aktivieren und zu erlauben, dass er endet. Das überlasse ich dir als Übung.

    
Groo 25.01.2012, 08:28
quelle
0

Verwenden Sie in diesem Fall

%Vor%     
Bonshington 25.01.2012 07:58
quelle

Tags und Links