await
, jak dowiedziałeś się, blokuje odpowiedź od powrotu do użytkownika, zanim zostanie to zrobione. Zwykle po prostu wstawilibyśmy swoje prace w tle do innego wątku i ustawialiśmy go tak, by "strzelał i zapominał", nie czekając, jednak w ASP.NET IIS wyłączy AppDomains, które nie są używane, a Task.Run
nie informuje IIS, że twój wątek tła " używa AppDomain ", więc wątek w tle mógł zostać zakończony z Thread.Abort()
podczas zamykania AppDomain.
Jeśli korzystasz z .NET 4.5.2 lub nowszego, możesz poinformować IIS, że masz pracownika pracującego w tle, którego musisz utrzymywać przy życiu przez QueueBackgroundWorkItem
. Można by użyć go jak ten
public ActionResult ProcessRec()
{
HostingEnvironment.QueueBackgroundWorkItem(waitTimer);
return RedirectToAction("Index", "Home");
}
public void waitTimer(CancellationToken token)
{
Thread.Sleep(10000);
}
//You also could do
public async Task waitTimer2(CancellationToken token)
{
await Task.Delay(10000);
}
Teraz to nie gwarantuje, że usługi IIS nie będzie wyłączyć aplikację domenę, ale nie pozwól, że wiesz, że jesteś w środku coś i prosi o więcej czasu, gdy nie próbuje wyłącz go (otrzymujesz do 90 dodatkowych sekund po zakończeniu zamykania, aby domyślnie ukończyć wszystkie oczekujące elementy tła). Aby uzyskać więcej informacji, przeczytaj
.
Która wersja .NET używasz. .NET 4.5.2 wprowadził funkcję, która ułatwia "robienie tego". –
Używam .NET 4.5 –
Zmieniłem twój tytuł. Zobacz, "[Czy w tytułach pytania powinny znaleźć się" znaczniki "?] (Http://meta.stackexchange.com/questions/19190/)", gdzie konsensus brzmi "nie, nie powinien". –