2012-04-24 11 views
6

To jest usługa sieci Web ASP.NET ASMX/.NET Framework 4.0.ThreadPool.QueueUserWorkItem w usłudze sieci Web dla zadania "Fire and Forget"

W usłudze sieciowej chcę wykonać jedną metodę na innym wątku, na przykład "Pożar i zapomnij", aby usługa sieci Web zwróciła wartość o pewną wartość w odpowiedzi natychmiast na stronę internetową. Ta metoda w innym wątku może zająć 10 minut po tym, jak usługa sieci Web odsyła odpowiedź natychmiast do witryny sieci Web. Ponadto nie potrzebuję zwracanej wartości tej metody.

Testowałem ten scenariusz przy użyciu ThreadPool.QueueUserWorkItem i wygląda na to, że wątek rozpoczęty przy użyciu ThreadPool będzie nadal wykonywany nawet po tym, jak usługa sieci Web zwróci odpowiedź z powrotem do witryny sieci Web. Czy mam tu rację? Czy istnieje lepszy sposób na osiągnięcie tego?

Odpowiedz

6

Problem polega na tym, że program ASP.NET od czasu do czasu przetwarza pulę aplikacji. Ponieważ nie wie o Twoim zadaniu w tle, nie będzie ono brane pod uwagę i zostanie przerwane po usunięciu AppDomain.

W większości przypadków praca zostanie zakończona, ale jeśli biegniesz wystarczająco długo, napotkasz ten scenariusz.

Istnieją dwa rozwiązania:

1) „właściwy” sposób jest napisać usługa systemu Windows, który działa poza ASP.NET. Możesz wysłać instrukcje do Usługi poprzez WCF.

2) "Szybka i brudna" metoda polega na napisaniu ukrytej usługi internetowej w witrynie ASP.NET, która nigdy nie jest wywoływana przez użytkowników. Twoja aplikacja uruchamia asynchroniczne żądanie do usługi ukrytej, a następnie zwraca użytkownikowi wynik bez czekania.

Program ASP.NET nie wie, że żądanie do usługi ukrytej pochodzi z wnętrza aplikacji - traktuje to tylko jako kolejną prośbę. Ponieważ program ASP.NET wie o tym żądaniu, nie przerwie go, gdy zostanie poddany recyklingowi.

+0

Cześć Nicholas, jak ukryta usługa sieci web w asp.net, zapewnia, że ​​pula aplikacji nie zostanie poddana recyklingowi? – Abhijeet

+0

Interesuje mnie "szybki i brudny" - czy powinienem po prostu utworzyć nową funkcję asynchroniczną, która jest wywoływana przez metodę usługi sieciowej, którą zainicjował użytkownik? –

Powiązane problemy