簡體   English   中英

如何將HTTP響應發送回用戶,但之后仍在服務器上執行更多操作?

[英]How can I send the HTTP response back to the user but still do more things on the server after that?

有時在調用給定的Action時需要做很多事情。 很多時候,需要完成的工作比為用戶生成下一個HTML需要做的更多。 為了讓用戶獲得更快的體驗,我想只做我需要做的事情來讓他們獲得下一個視圖並將其發送出去,但之后仍然會做更多的事情。 我怎么能這樣做,多線程? 那么我是否需要擔心確保不同的線程不會踩到彼此的腳? ASP.NET MVC中是否存在此類內容的內置功能?

正如其他人所提到的,您可以使用衍生線程來執行此操作。 我會注意考慮幾個邊緣情況的“臨界性”:

  • 如果您的后台任務遇到錯誤,並且無法執行用戶期望的操作,您是否有向用戶報告此失敗的機制?
  • 根據各種任務的“業務關鍵”程度,使用健壯/彈性消息隊列來存儲“要處理的后台任務”將有助於防止用戶請求某些操作,服務器負責崩潰或被占用的情況脫機,或IIS服務重新啟動等,后台線程永遠不會完成。

只是你可能需要解決的其他問題的食物。

我怎么能這樣做,多線程?

是!

那么我是否需要擔心確保不同的線程不會踩到彼此的腳?

無論如何 ,這是您需要處理的事情,因為兩個不同的ASP.NET請求可以同時到達(來自不同的客戶端)並且可以同時在兩個不同的工作線程中處理。 因此,即使沒有您的新功能,任何訪問共享數據的代碼都需要以線程安全的方式進行編碼。

ASP.NET MVC中是否存在此類內容的內置功能?

標准的.net多線程技術在這里應該可以正常工作(手動啟動線程,或使用Task功能,或使用Async CTP,......)。

這取決於你想做什么,以及你需要多么可靠。 如果在發送響應之后掛起的operaitons可以丟失,那么.Net異步調用,ThreadPool或新線程都可以正常工作。 如果進程崩潰,則掛起的工作將丟失,但您已經接受這可能發生。

如果工作需要任何可靠的保證,例如工作在站點數據庫中發生更新,那么你就不能使用.Net進程線程,你需要保留請求來完成工作,然后即使在進程重啟后也要處理這項工作(應用程序池回收為IIS如此友好調用它們)。

一種方法是使用MSMQ。 其他方法是使用數據庫表作為隊列 最可靠的方法是使用數據庫激活機制,如異步過程執行中所述

您可以啟動后台任務,然后從操作返回。 此示例使用.NET 4.0中的任務Parallel Library:

public ActionResult DoSomething()
{
    Task t = new Task(()=>DoSomethingAsynchronously());
    t.Start();

    return View();
}

我會使用MSMQ進行這類工作。 我沒有在ASP.NET應用程序中生成線程,而是使用Asynchronous out of process方法來執行此操作。 它非常簡單,非常干凈。

事實上,我已經在ASP.NET應用程序中使用MSMQ很長一段時間了,並且從未遇到過這種方法的任何問題。 此外,具有不同的進程(即在不同的應用程序域中的可執行文件),長時間運行的工作是處理它的理想方式,因為您的Web應用程序不用於執行此工作。 因此,IIS,線程池和您的Web應用程序可以繼續執行他們需要的操作,而其他進程可以處理長時間運行的任務。

也許你應該試一試: 在ASP.NET MVC中使用異步控制器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM