我寫了一個函數,它需要一大堆文件,將它們拉起來,然後允許用戶通過asp.net網站下載這個zip文件。在反饋中運行一些東西
但是,這些壓縮文件將會非常大(如1GB大),所以它不會立即發生,我想要做的就是能夠在單獨的線程上運行(可能的?),而用戶繼續瀏覽網站,一旦創建了壓縮文件,就可以通過某種方式通知他們,以便他們可以下載此壓縮文件。
我一直希望得到一些關於如何在c#中以及在UI方面做到最好的指示。
在此先感謝。
我寫了一個函數,它需要一大堆文件,將它們拉起來,然後允許用戶通過asp.net網站下載這個zip文件。在反饋中運行一些東西
但是,這些壓縮文件將會非常大(如1GB大),所以它不會立即發生,我想要做的就是能夠在單獨的線程上運行(可能的?),而用戶繼續瀏覽網站,一旦創建了壓縮文件,就可以通過某種方式通知他們,以便他們可以下載此壓縮文件。
我一直希望得到一些關於如何在c#中以及在UI方面做到最好的指示。
在此先感謝。
使用 Asynchronous Pages in ASP.NET 2.0
你不能等待太久在asp.net完成的任務,因爲頁面回收的恐懼,會話過期,這將是您在使用壓縮這些文件是巨大的一些其他的進程,並更新一個標誌,無論是在數據庫或私人網絡中的某個地方,您的zip組件準備就緒!你的asp.net應用程序應該讀這個標誌,並讓用戶知道他們的zip文件已經準備好下載了。
使用的BackgroundWorker:http://msdn.microsoft.com/en-us/library/cc221403(VS.95).aspx
BackgroundWorker的對象也可能是你在找什麼。 這裏是一個很好的教程:http://dotnetperls.com/backgroundworker
您可以使用BackgroundWorker
組件。它有能力提高進度事件,您可以使用它向主線程(如UI)提供反饋。
public void static Main()
{
var bw = new BackgroundWorkder();
bw.DoWork += _worker_DoWork;
bw.RunWorkerCompleted += _worker_RunWorkerCompleted;
bw.ProgressChanged += _worker_ProgressChanged;
bw.WorkerReportsProgress = true;
bw.WorkerSupportsCancellation = false;
//START PROCESSING
bw.RunWorkerAsync(/*PASS FILE DATA*/);
}
private void _worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker bw = sender as BackgroundWorker;
var data = e.Argument as /*DATA OBJECT YOU PASSED*/;
//PSEUDO CODE
foreach(var file in FILES)
{
zipFile;
//HERE YOU CAN REPORT PROGRESS
bw.ReportProgress(/*int percentProgress, object userState*/)
}
}
private void _worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Just update progress bar with % complete or something
}
private void _worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
//...
}
else
{
//......
}
}
非常好,謝謝你的示例代碼,我會給它一個提示,但這是否意味着用戶仍然可以在網站上瀏覽並且_worker_RunWorkerCompleted仍然會在某個時候觸發? – Coesy 2010-11-23 05:56:32
這是一個很好的觀點,謝謝,我會考慮這一點。 – Coesy 2010-11-23 05:58:13