Wie können Sie HttpContext.Current beim Multi-Threading verwenden?

8

Zur Klärung meiner Frage habe ich eine App entwickelt, die viele Datenbank-Updates / Web-Service-Aufrufe basierend auf der Eingabe eines Benutzers (unter Verwendung einer Excel-Tabelle) durchführt. Wenn es viele Aktualisierungen gibt, kann der Vorgang mehr als 20 Minuten dauern.

Um zu verhindern, dass meine Benutzeroberfläche einfriert / aussetzt, habe ich nach Multithreading gesucht, damit ich meinen lang andauernden Prozess asynchron ausführen kann und in der Zwischenzeit einfach ein animiertes gif anzeigen kann, während der Prozess läuft.

Das alles scheint im Moment gut mit meinen Testdaten zu laufen, aber wenn ich den tatsächlich lang andauernden Prozess ersetze, erhalte ich einen Fehler bezüglich HttpContext.Current.User.Identity.Name. Ich habe darüber gelesen und von diesem Artikel1 nahm ich es zu meinen Wenn Sie die Async-Eigenschaft in der Seitendirektive auf "true" setzen und die Methode "RegisterAsyncTask" verwenden, können Sie auf "HttpContext.Current" zugreifen. Für mich scheint das jedoch nicht wahr zu sein. Ich bin mir sicher, dass es etwas ist, was ich tue, also hier ist mein Code (ich habe hauptsächlich die folgenden Artikel verwendet, um dies zu schreiben. artikel2 und artikel3 ):

ASP.NET-Seite

%Vor%

C # - RegisterAsyncTask wird auf Knopfdruck ausgeführt, wodurch der langwierige Prozess gestartet wird:

%Vor%

C # - Arbeiterklasse

%Vor%

Anfangs enthielt mein Testcode keinen Aufruf von HttpContext.Current.User.Name für ar.UserName, aber nach meinen Problemen mit dem Zurücksetzen des Aufrufs von ExcelFileProcessing.PassValidUpdates () habe ich mich entschieden, dies zu tun. Wenn ich diesen Teil erreiche (ar.UserName = HttpContext.Current.User.Identity.Name), wird 'Objektverweis nicht auf eine Instanz eines Objekts gesetzt' angezeigt, was darauf hindeutet, dass der HttpContext nicht in den zweiten Thread übertragen wird. Wie kann ich das tun?

AKTUALISIEREN

Ich habe im Moment zu meinem vorherigen Code (der ursprünglich nicht funktionierte) zurückgekehrt und einfach den HttpContext.Current als Variable an meine DoWork-Methode gemäß diesem SO Frage wie folgt:

2. Faden erstellen

%Vor%

Arbeiterklasse

%Vor%

Dies scheint zu funktionieren, da ich nun auf HttpContext.Current und den von mir erwarteten Benutzernamen zugreifen kann. Ich denke, das ist wahrscheinlich zu einem gewissen Grad das, was einige von Ihnen vorgeschlagen haben. Ich schätze die von Andrew Morton vorgeschlagene Lösung, aber im Moment würde dies eine wesentliche Neufassung erfordern. Im Moment ruft mein Prozess bereits einen Web-Service auf, um den Datenbank-Kram zu erledigen und gibt ein Erfolgs- oder Fehlerergebnis zurück. Es muss auch direkt einen anderen BPEL-Dienst aufrufen. Daher vermute ich, dass es weitere Leistungseinbußen geben könnte, wenn ich all dies in einen anderen Webservice einbinden müsste. Darüber hinaus werden die meisten Aufrufe an den Prozess nicht so lange dauern (wahrscheinlich weniger als 10 Minuten), so dass dies wirklich nur für die wenigen Anfragen gilt, die 20 Minuten überschreiten. Schließlich wird dies wahrscheinlich nur von 1 oder 2 Personen verwendet, so dass es unwahrscheinlich ist, dass es eine große Anzahl von Anfragen gleichzeitig gibt.

Aber im Hinblick auf meine derzeitige Lösung, sollte mir irgendetwas bewusst sein, dass mich stolpern könnte? IIS verursacht Probleme? Jede zusätzliche Hilfe würde sehr geschätzt werden.

    
sr28 06.08.2014, 15:18
quelle

1 Antwort

1

Ich habe eine Site auf einem gemeinsam genutzten Server. Ich brauche einen BATCH-Job und tue das in einem anderen Thread. Es kann bis zu 1 Stunde dauern (ich ping die Site, damit der Worker-Prozess nicht aufhört).

Ich ging die Straße des Bindens hinunter, um den aktuellen Kontext zu bekommen. Nach vielen Stunden der Recherche und Suche kann es nicht getan werden. In einem neuen Thread ist der httpcontent.current nicht vorhanden, es ist nicht derselbe Thread, auf den der Benutzer zugegriffen hat, daher wurde der Kontext nicht übernommen und Sie können nicht auf den angemeldeten Benutzer zugreifen, da sie nicht in diesem Thread angemeldet sind.

    
Patrick 28.08.2014 01:10
quelle