2010-11-15 31 views
4

我們有一個CSV上傳器,用戶可以上傳CSV文件,其中包含地址,城市,州,郵政編碼。 CSV文件可以是數百,數千,甚至數千行。如何排隊工作由服務器完成ASP.NET

我們需要對行進行地理編碼;沒問題,我們正在使用Google Maps RESTFul Web Service,但我不想讓用戶等待每一行進行地理編碼(可能需要一些時間)。基本上,我希望上傳完成,然後奇蹟般地將地理編碼作業傳遞給服務器,並允許用戶繼續瀏覽Web應用程序,而地理代碼發生在後臺。

我認爲,這個系統需要一個隊列或基於工作的軟件;也許是ZeroMQ或RabbitMQ?我沒有這方面的經驗,所以餵養寶寶會很棒。我們正在使用ASP.NET C#。

回答

3

你的想法使用排隊是健全的。如果您正在爲Windows設備開發,帶有MSMQ端點的WCF是第三方排隊技術的替代方案。

+0

您可能是指WCF,而不是WFC。 – SecretDeveloper 2010-11-15 21:36:41

+0

大聲笑,對的你是 – Jacob 2010-11-15 21:37:34

+0

我第一次寫了MFC。 – Jacob 2010-11-15 21:38:27

1

消息隊列軟件的替代方法是使用數據庫來跟蹤CSV處理請求。

您的CSV處理代碼可以在每個請求的狀態發生變化時更新表格。

您的ASP.NET網站可以查詢該表以向用戶顯示每個請求的狀態。

+0

但問題是數據(ArrayList)仍然位於用戶要求上傳的原始ASP.NET頁面上。我希望該頁面可以完成加載,因此用戶可以導航到其他頁面,但不知道在後臺我們仍在對CSV地址進行地理編碼。我需要以某種方式將ArrayList傳遞給子工作者。 – Justin 2010-11-15 21:20:34

+1

@Justin - 當用戶上傳時,不要立即啓動當前ASP.NET線程的地理編碼。只需將項目插入表格,然後將回復發送回瀏覽器。在單獨的應用程序中,定期在表格中查找新項目並啓動地理編碼處理。 – mbeckish 2010-11-17 19:13:27

2

這應該是可能的,通過旋轉一個新的線程,你通過地理編碼工作,然後返回頁面響應正常的用戶。 This question covers much the same problem.

你可以嘗試這樣的:

ThreadPool.QueueUserWorkItem(delegate { 
    DoGeocoding(state details); 
}); 

您可能會或可能不會需要調用Response.Flush之後返回當前頁面的請求,並允許用戶進行瀏覽。

+0

我可以從ASP.NET Web應用程序創建新線程嗎? – Justin 2010-11-15 21:17:35

+0

是的,它的c#代碼就像任何其他。每個傳入請求都有自己的線程。唯一的風險是你想返回訪問者頁面而不等待子線程返回,你不希望父線程等待,或者子線程過早死亡。因爲我不是專家(或者好老師!),所以值得閱讀關於線程化的教程,但是並不像有些人所瞭解的那樣難以學習。 – 2010-11-15 21:21:18