2010-12-10 11 views
3

Dies kann an einem mangelnden Verständnis dafür liegen, was unter der Haube vor sich geht, oder einfach nur an fehlendem Verständnis für Threading im Allgemeinen. Wenn sich ein Benutzer anmeldet, muss ich einige Aufgaben ausführen, die Webdienste aufrufen, um Daten in meinem System zu aktualisieren. Da die Dienste sehr viel Zeit in Anspruch nehmen können, fädle ich den gesamten Prozess ein. Obwohl ich denke, dass ich die ganze Reihe von Aufgaben in einem Thread getrennt von meiner Anwendung ausführe, wartet meine Anwendung, bis die aufgerufene Funktion beendet ist, bevor sie fortfährt.ThreadPool.QueueUserWorkItem Verursacht, dass die App bis zum Ende hängt

WindowsIdentity identity = WindowsIdentity.GetCurrent(); 
Manager manager = (Manager)Session["Manager"]; 

ThreadPool.QueueUserWorkItem(new SafeWaitCallback().Call(identity, delegate(object noCallBack) 
{ 
    manager.RunAccountUpdater(identity); 
})); 

Die Anwendung hängt, bis die Funktion „RunAccountUpdater“ beendet ist und der Rückruf erfolgt. Was mache ich falsch/nicht verstanden?

+3

Haben Sie einen verwandten Thread-Sync-Code hier? Beitreten? Sperren? Mutex? Alles ähnlich wie Control.Invoke? Alles andere, was blockieren könnte? –

+0

Nichts explizit. – Chris

+4

'neue SafeWaitCallback(). Call' läuft synchron. Nur sein Ergebnis (von dem ich annehme, dass es sich um einen WaitCallback handelt) wird auf dem ThreadPool eingeplant. Sind Sie sicher, dass es "manager.RunAccountUpdater" und nicht "new SafeWaitCallback(). Call" ist, das Ihre Anwendung blockiert? Können Sie den vollständigen Code der 'SafeWaitCallback' Klasse hinzufügen? (Sie scheinen es im Vergleich zu [diesem] (http://flimflan.com/blog/SafelyRunningBackgroundThreadsInASPNET20.aspx)) geändert zu haben. – dtb

Antwort

0

Gehen Sie durch Sie tatsächlich dort Aussage durch Aussage - es wird obiouss sein.

ThreadPool.QueueUserWorkItem (neu SafeWaitCallback() Call (Identität, Delegat (Objekt noCallBack) { manager.RunAccountUpdater (Identität); }.));

Dies geschieht von innen nach außen.

  • Sie deklarieren einen Delegierten.
  • Sie verwenden dann SafeWaitCallback(). Rufen Sie EXECUTE die Operation auf.
  • Dann Warteschlange Sie das Ergebnis des Aufrufs an .... der Thread-Pool.

Voila - hier ist Ihr Problem. Sie müssen den Aufruf an den Delegierten in Warteschlange stellen, nicht das Ergebnis der Ausführung.

Verwandte Themen