2015-04-29 12 views
24

Czym dokładnie jest różnica przy użyciuRóżnica między Task.Run i QueueBackgroundWorkItem w Asp.Net

Task.Run(() => { 
    LongRunningMethod(); 
}); 

lub

HostingEnvironment.QueueBackgroundWorkItem(clt => LongRunningMethod()); 

Testowałem na aplikacji Asp.Net MVC, w którym trzymane na piśmie linię do pliku tekstowego przez około 10 minut wewnątrz asynchronicznego zadania wywoływanego przy użyciu Task.Run lub QBWI.

To działa dobrze zarówno przy użyciu zadania i QBWI. Moja metoda asynchroniczna kontynuuje pisanie do tego pliku bez żadnych problemów do 10 minut. Żadne zakłócenia z IIS, które zaobserwowałem, dotyczące jego recyklingu.

Co jest więc wyjątkowego w QueueBackgroundWorkItem?

Odpowiedz

23

documentation ma doskonałe wyjaśnienie:

różni się od normalnej pozycji roboczej pula wątków że ASP.NET może zachować śledzić jak wielu elementów roboczych zarejestrowanych przez ten interfejs API jest obecnie działa, a Środowisko wykonawcze ASP.NET będzie próbowało opóźnić wyłączenie AppDomain: , dopóki te elementy robocze nie zostaną zakończone. Ten interfejs API nie może być wywoływany poza aplikacją AppDomain zarządzaną przez ASP.NET. Podany Token odwołujący się zostanie zasygnalizowany, gdy aplikacja zamknie się w dół .

Task.Factory.StartNew nie rejestruje pracę z wykonywania ASP.NET w ogóle. Używasz swojego kodu przez 10 minut, co nie ma znaczenia. Recykling IIS odbywa się w określonym czasie, który jest preset in IIS. Jeśli naprawdę chcesz przetestować, co się dzieje, możesz spróbować uzyskać force a recycle.

+2

Tak, zmuszony do odtworzenia z IIS inetmgr zarówno przy użyciu zadanie i QBWI i oboje zatrzymał naraz. –

+4

Wymuszenie recyklingu nie jest równoznaczne z recyklingiem w określonym czasie. Wymuszenie odbioru wszystkiego usuwa, niezależnie od zadań, ponieważ jest to podręcznik, a przez to próbujesz "zresetować" wszystko. Jestem pewien, że nowe 'QueuedBackgroundWorker' nie zostanie poddane recyklingowi z normalnym przetwarzaniem czasowym IIS, lub opóźnia przetwarzanie, ponieważ IIS wie, że coś się dzieje. – ppumkin

8

Poniżej artykuł wyjaśnia coś podobnego do tego, co robisz i jeśli pójdziesz do końcowej sekcji „Niewiele więcej myśli ...” widać różnicę podkreślono między dwoma

http://codingcanvas.com/using-hostingenvironment-queuebackgroundworkitem-to-run-background-tasks-in-asp-net/

zasadzie to mówi że za pomocą zadań queuebackgroundworkitem są rejestrowane w środowisku wykonawczym ASP.Net i jeśli proces jest zamknięty lub awarie środowisko wykonawcze ASP.NET nadal zapewnia pewien okres karencji dla procesów do wykonania. Obejmuje to również wysyłanie powiadomień do procesu, aby można było go zawinąć i wykonać zadania finalizacji, podczas gdy wszystko to nie jest dostępne, gdy używasz Task.Run

1

Wyłączenie AppDomain może być opóźnione o 90 sekund (w rzeczywistości jest to minimum HttpRuntimeSection.ShutdownTimeout i processModel shutdownTimeLimit). Jeśli w kolejce znajduje się tyle elementów, których nie można ukończyć w ciągu 90 sekund, środowisko wykonawcze ASP.NET zwolni element AppDomain bez oczekiwania na zakończenie elementów roboczych.

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

Powiązane problemy