Übergeben von Daten zwischen ThreadPool-Threads

8

Ich habe einen C # -Webserver, den ich mit dem StackOverflow-Miniprofiler erstellt habe. Da es sich nicht um einen ASP.NET-Server handelt, sondern jede Anfrage in der Regel auf einem eigenen Thread ausgeführt wurde, habe ich den Miniprofiler so eingerichtet, dass er ThreadStatic storage verwendet, um alle Profiler einer eingehenden Anfrage von Anfang bis Ende zu verfolgen. Das hat gut funktioniert.

Vor kurzem haben wir alles konvertiert, um async/await zu verwenden, was bedeutet, dass Fortsetzungen nach einer await in der Regel nicht auf die gleiche Thread zurückkommen und somit der ThreadStatic Speicher nicht mehr funktioniert.

Wie kann man in diesem Fall einige kleine Daten zwischen verschiedenen ThreadPool -Threads übertragen? Gibt es SynchronizationContext Implementierungen, die für so etwas nützlich wären?

    
Cuthbert 22.04.2015, 19:10
quelle

1 Antwort

8
  

Was ist der beste Weg, um ein kleines Stück Daten zwischen verschiedenen ThreadPool-Threads in diesem Fall zu übergeben?

Mit dem logischen Anrufkontext über die CallContext Klasse. Es stellt zwei statische Methoden: LogicalSetData und LogicalGetData . Der Aufruf Kontext wird über das ExecutionContext gelagert und serialisiert, die auch von dem Sync-Kontext zuständig ist, etc.

Die Verwendung dieser Klasse hat zwei Einschränkungen:

  1. Sie sind auf die Verwendung von .NET 4.5 und höher beschränkt

  2. Der logische Aufrufkontext verwendet die Semantik zum Kopieren und Schreiben und führt eine flache Kopie durch, sobald die Daten mutiert sind. Das heißt, Sie sollten nur unveränderliche Daten verwenden, da die Referenzen über mehrere Threads gemeinsam genutzt werden.

  3. können

Zu beachten ist, dass CallContext erst initialisiert wird, wenn Sie es aufrufen. Dies bedeutet, dass Sie bei der Verwendung aufgrund der Copy-on-Write-Funktion etwas Overhead benötigen.

Mehr dazu finden Sie in einem Beitrag von Stephan Cleary namens Implicit Asynchroner Kontext

    
Yuval Itzchakov 22.04.2015, 20:55
quelle