HTTPContext über threads

Brauche ich, um zu instanziieren Sie ein singleton-Objekt pro web-Anfrage, so dass die Daten einmal verarbeitet und ist gültig während der gesamten Anforderung, ich war mit HttpContext.Current.Items zu teilen, die Daten während der HTTP-Anfrage, alles war gut, bis wir brauchten die singleton-Objekt-Instanz über mehrere threads, das erste, was ich kam mit war zu passieren, die HttpContext-Instanz für den neuen thread:

HttpContext context = HttpContext.Current;
ThreadPool.QueueUserWorkItem(callback =>
    {
        HttpContext.Current = context;
        //blah blah
    });

Was ich nicht glaube, ist eine thread-safe-Ansatz als hier angemerkt.

Mit dem Reflektor dachte ich HttpContext.Aktuelle.Elemente, die tatsächlich verwendet CallContext, um Objekte zu speichern, die in jeder logische thread. Also änderte ich die singleton-Schnittstelle:

public static SingletonType SingletonInstance
{
    get { return CallContext.GetData(key) as SingletonType; }
    set { CallContext.SetData(key, value); }
}

Und überschreiben Sie einfach SingletonInstance beim Start jeder neuen thread! Der code funktioniert gut, aber es scheint, dass irgendwie unter der schweren Last, CallContext.GetData(key) den Wert null zurück und stürzt die Anwendung mit einem null-Verweis-Ausnahme!

Ich dachte, wenn CallContext.GetData ist atomic? Aber es scheint einfach nicht richtig, die CallContext ist thread-spezifische Daten Speicher und muss atomar, oder mir fehlt der Punkt!

Meine andere Vermutung ist, dass die Einstellung der SingletonInstance (CallContext.SetData) passiert in einem thread, während CallContext.GetData führt, die in einem anderen als hier angemerkt aber ich weiß nicht, wie/warum?

update:

Halten wir eine Instanz von jedem online-Nutzer in einem array auf dem server. Das singleton-Objekt ist eigentlich ein Verweis auf das Objekt für den aktuellen Benutzer. Aktuellen Benutzers muss eindeutig sein und in jedem thread für die Datenbank-Abfragen, die Protokollierung, Fehlerbehandlung und mehr, dies ist, wie es gemacht wird:

public static ApplicationUser CurrentUser
{
    get { return CallContext.GetData("ApplicationUser") as ApplicationUser ; }
    set { CallContext.SetData("ApplicationUser", value); }
}
Ein HttpContext-bezieht sich auf eine einzelne Http-Anfrage. Queueing es irgendwo in einem thread zu führen, dass Sie einige Probleme (da hast du offenbar herausgefunden). Vielleicht, wenn Sie beschreiben, was es ist Sie versuchen zu tun, können wir kommen mit einer besseren Lösung?
Das problem ist einfach, ich brauche ein einzelnes Objekt Referenz-in meinem applicatin instanziiert wird mit jeder Anfrage (Anwendung BeginRequest vielleicht) und lebendig ist, während die Anforderung, und jedem möglichen thread danach gestartet

InformationsquelleAutor Kamyar Nazeri | 2012-03-31

Schreibe einen Kommentar