Ich habe einen HTTP-Server, den ich schreibe mit HTTP-Listener, und ich möchte irgendwie Variablen als zugänglich von überall innerhalb eines Threads deklarieren.Festlegen einer globalen Variable in einem Thread - C#
Ich dachte an ein Wörterbuch: Dictionary</*[type of Thread ID here]*/,ThreadData>
, aber ich bin besorgt, es könnte Threading-Probleme sein. ThreadData
würde wahrscheinlich eine Klasseninstanz sein, aber ich könnte eine Struktur verwenden, je nachdem, welche effizienter wäre.
- Wenn ich das Wörterbuch zu den Themen-IDs eingeben würde und programmieren Sie es so, dass ein Thread würde nur für einen eigenen Eintrag fragt im Wörterbuch, würde jeder Thread Probleme im Zusammenhang mit dabei sein, wenn das Wörterbuch zugreifen?
- Jeder Thread würde seinen eigenen Eintrag hinzufügen. Müsste ich das Wörterbuch sperren, während ich neue Thread-Einträge hinzufüge? Wenn ja, wäre ich in der Lage, ein separates Sperrobjekt zu verwenden, damit Threads in der Zwischenzeit auf ihre eigenen Daten zugreifen können?
Wäre es von Vorteil, ein Concurrent Dictionary zu verwenden? Gibt es einen anderen Weg, der threadsicherer ist?
Ich verwende derzeit ThreadPool.QueueUserWorkItem
. Ich weiß nicht sicher, dass dies für jeden Artikel einen neuen Thread verwendet. Wenn nicht, könnte ich es auch in den Kontext eintasten.
Update: Nach ThreadPool class - MSDN, es Wiederverwendung Threads. Und es löscht Thread-Daten nicht.
Wenn der Threadpool einen Thread wiederverwendet, werden die Daten im lokalen Threadspeicher oder in Feldern, die mit dem ThreadStaticAttribute-Attribut markiert sind, nicht gelöscht. Wenn eine Methode lokale Thread-Speicher oder Felder untersucht, die mit dem ThreadStaticAttribute-Attribut markiert sind, können die gefundenen Werte daher von einer früheren Verwendung des Thread-Pool-Threads übrig bleiben.
Haben Sie versucht, die Subklassen [Background] (http://msdn.microsoft.com/en- us/library/system.componentmodel.backgroundworker.aspx) Klasse? – Romoku
Da Sie einen eindeutigen Einstiegspunkt für Ihre Worker-Threads haben und Sie die Worker-Logik selbst schreiben, sollte es kein Problem für Sie sein, die alten Thread-Daten zu löschen. – Gene