2011-07-21 102 views
1

我創建要上載的文本文件,並建立他們到多個PDF頁面。他們只是從Excel出口。文件中的每一行對應於需要創建的新PDF。在哪裏存儲進度信息在ASP.Net Web應用程序

無論如何,一旦文件上傳我要開始處理它們,但我不希望用戶必須在網頁上停留,甚至還有自己的會議開幕。例如,他們可以關閉瀏覽器並在10分鐘後回來登錄,並且進度信息會顯示112/200文件處理等。這將比這更快。

所以有兩個問題,我怎樣才能將這個處理工作傳遞給一些(處理程序?線程?),當頁面關閉時它將繼續運行,並且一旦作業開始就會返回(所以瀏覽器不是不停止)?其次,我可以在哪裏存儲這些信息,以便當用戶回到頁面時,他們可以看到當前的進度。

我意識到我不能使用會話,並且因爲它會處理大約一個文件一秒鐘我不會真的想要每秒更新一次數據庫。有什麼辦法可以做到這一點?可能嗎?

+0

看一看像http://blog.bluesam.com/2008/06/running-batch-jobs-in-aspnet-web.html這可能讓你在正確的方向前進。 –

+0

看起來像諸如此類的事情,我在尋找,我要看看,當我回家 –

回答

-1

我通過使用astander上面提供的鏈接解決了這個。我只需在HttpContext.Application中創建一個對象來存儲進度變量,然後設置我在新線程中處理的方法。

// Create the new progress object 
BatchProgress bs = new BatchProgress(0); 
if(Application["BatchProgress"] != null) 
{ 
    // Should never happen 
    Application["BatchProgress"] = bs; 
} 
else 
{ 
    Application.Add("BatchProgress","bs"); 
} 

//Set up new thread, run batch is the method that does all the processing. 
ThreadStart ts = new ThreadStart(RunBatch); 
Thread t = new Thread(ts); 
t.Start(); 

然後在線程啓動後返回,我可以使用jQuery定期獲取Application [「BatchProgress」]對象。在線程結束時,BatchProgress對象的狀態設置爲「完成」,然後當jQuery查詢它時,它會看到完整狀態並從應用程序中刪除進度對象。

+1

這似乎在測試工作,但你在這裏有兩個大問題。首先,如果沒有人訪問您的網站一段時間,您的處理批可能會被殺死。第二個是HttpContext.Application()項目由您網站的所有用戶共享_shared_,因此一個用戶最終可能會覆蓋另一個用戶的批處理引用並查看他們的進度信息。相反,你需要建立一個Windows服務並與之交談。 –

+0

哦,我不知道批次會被殺死,這有點令人擔憂。但是,批處理引用不允許覆蓋,但只有在應用程序[「BatchProgress」]等於空值時才能使用頁面所需的功能,否則將從頁面中刪除服務器控件,而顯示BatchProgress。在一個管理網站上只有一個用戶使用它,所以我一次只需要一個批處理。該批次將每週運行一次。我的加工批次將被殺掉多久? –

+0

這取決於IIS中的設置,以及您的網站獲得的流量。我認爲默認是20分鐘的空閒時間,但我的記憶在確切的時間限制上是模糊的。之後,託管該網站的應用程序池將關閉。所以如果你在公共互聯網上還有一個受歡迎的網站,那你很好。如果這是它自己的應用程序池,並且只有一個人每週訪問一次,那麼您可能會遇到問題。 –

相關問題