2012-12-06 60 views
3

關注:關注與長期運行在IIS進程

我經歷的職位/描述IIS可以回收隨時應用程序池的博客閱讀。這是否意味着(就IIS回收應用程序池而言),如果我調用同步或異步的長時間運行的進程,無關緊要,因爲IIS可以回收應用程序池並終止長時間運行的進程?如果是這種情況,確保這種情況不會發生的常見途徑是什麼?

public Task<ActionResult> LongRunningProcessAsync(SubmitFileModel aModel) 

    { 
     return Task.Run(() => LongRunningProcess(aModel)); 
    } 

回答

4

HostingEnvironment有一個靜態方法,RegisterObject,允許你將對象放置在應用程序註冊的對象的列表。

According to Phil Haack...

當ASP.NET拆毀的AppDomain,它會首先嚐試調用 Stop方法對所有註冊的對象....當ASP.NET調用這個方法,你的代碼需要防止這種方法返回,直到你的工作完成。

或者,您可以創建一個不由IIS託管的服務。

+0

對!這正是我需要的。 –

0

如果是這種情況,確保這種情況不會發生的常見途徑是什麼?

無論使用或不使用RegisterObject方法,您的應用程序域都將在回收過程中卸載。它只會讓您的後臺工作完成一段時間(默認爲30秒)。如果長時間運行的工作超過這個「一段時間」,它將被中止,並且沒有人會關心重新啓動時的自動重試。

如果您想在ASP.NET應用程序中運行長時間運行的作業,爲了簡單起見,忘記ASP.NET/IIS問題,請查看HangFire - 它使用持久性存儲(SQL Server或Redis)並對回收過程具有免疫力。