2008-12-02 44 views
8


我有一個應用程序,我需要用戶上傳照片。照片上傳到服務器後,應該不會很長時間,用戶應該收到一個響應,這是一個普通的HTML頁面,上面寫着「謝謝... bla bla bla ...」
現在,響應之後被髮回給客戶端,他繼續他的快樂方式,我希望服務器繼續在這張照片上工作。它需要做一些很重的事情,需要很長時間。但這是好的,因爲用戶沒有等待任何東西。他可能在不同的頁面。
所以我的問題是,我如何做到這一點與ASP.NET。 我正在寫的應用程序是在ASP.NET MVC所以我想象像如何在使用ASP.NET返回響應之後繼續在服務器上工作? (WebForms和MVC)

//save the photo on the server 
//and send viewdata saying "thanks..." 
return View(); 
//keep doing heavy processing on the photo 

但我想這是不是真的它是如何做。另外,由於有時候我會使用ASP.NET WebForms,所以WebForms也是如此。
謝謝!

回答

5

我們一個輕量級的日誌記錄的情況做到這一點:

Action<object> d = delegate(object val) 
{ 
    // in this anonymous delegate, write code that you want to run 
    ProcessDataAndLog(); 
}; 

d.BeginInvoke(null, null, null); // this spins off the method asynchronously. 

這絕不是穩健的。如果你需要一個被處理的保證,你應該考慮一個消息隊列。這樣,您也可以將處理卸載到單獨的計算機上,而不會讓您的Web服務器停滯不前。

編輯:

下也適用,而且可能是一個小更明顯,你的同胞編碼器。它本質上是一樣的,但顯然更快,你不需要擔心調用EndInvoke()。

System.Threading.ThreadPool.QueueUserWorkItem(
    delegate(object state) 
    { 
     // in this anonymous delegate, write code that you want to run 
     ProcessDataAndLog(); 
    }); 

延伸閱讀:The Thread Pool and Asynchronous MethodsAsynchronous delegate vs thread pool & threadDoes not calling EndInvoke really cause a memory leak ?

+0

而你最終可能會發生內存泄漏。應該總是調用EndInvoke。 – leppie 2008-12-03 13:31:43

1

在我看來,你需要分離出另一個進程來做你需要做的事情。你甚至可能想要構建一個Windows服務來處理圖像的處理。它可能是一個等待文件出現在某個地方的應用程序,當它啓動時,它可以開始工作,離開asp.net線程開始其業務。

0

我不是ASP.NET程序員,但通常這樣做的方式是在服務器上啓動另一個線程,在原始線程返回視圖並退出時爲您做後臺處理。

看看你是否能找到的東西,如果你搜索「ASP.NET啓動線程」

+2

IIS可以回收處理(並殺死線程)取決於許多條件 - 其中一些是不可預測的。因此,將線程用於與請求/響應無關的後臺工作並不是一個好主意。 – 2008-12-02 20:43:48

0

它看起來像你需要有第二個過程,需要額外的處理的照顧。您可以讓您的原始頁面啓動流程,也可以使用獨立應用程序輪詢文件夾並在照片到達時處理它們。這樣您也可以防止對Web服務器和工作進程徵稅。

1

過去我做過的一種方式,與網絡模型有點相似,就是有一個「私人」頁面/網絡服務,負責啓動處理並監聽呼叫。將頁面異步地與另一個頁面交談,然後繼續進行用戶的操作非常簡單。

0

我可能會創建一個在服務器上運行的Windows服務和使用填充隊列來處理照片。所以會改變你的

//save the photo on the server 
//Add referance in queue (possibly in database to http post that the windows service monitors with details of path to the file, output path, transformation etc.) 
//and send viewdata saying "thanks..." 
return View(); 

這樣做的照片的實際處理是完全獨立於網站,並節省您的紡紗線到處都是。

科林ģ

相關問題