2010-11-23 82 views
3

我写了一个函数,它需要一大堆文件,将它们拉起来,然后允许用户通过asp.net网站下载这个zip文件。在反馈中运行一些东西

但是,这些压缩文件将会非常大(如1GB大),所以它不会立即发生,我想要做的就是能够在单独的线程上运行(可能的?),而用户继续浏览网站,一旦创建了压缩文件,就可以通过某种方式通知他们,以便他们可以下载此压缩文件。

我一直希望得到一些关于如何在c#中以及在UI方面做到最好的指示。

在此先感谢。

回答

2

使用 Asynchronous Pages in ASP.NET 2.0

你不能等待太久在asp.net完成的任务,因为页面回收的恐惧,会话过期,这将是您在使用压缩这些文件是巨大的一些其他的进程,并更新一个标志,无论是在数据库或私人网络中的某个地方,您的zip组件准备就绪!你的asp.net应用程序应该读这个标志,并让用户知道他们的zip文件已经准备好下载了。

+0

这是一个很好的观点,谢谢,我会考虑这一点。 – Coesy 2010-11-23 05:58:13

1

您可以使用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 
    { 
     //...... 
    } 
} 
+0

非常好,谢谢你的示例代码,我会给它一个提示,但这是否意味着用户仍然可以在网站上浏览并且_worker_RunWorkerCompleted仍然会在某个时候触发? – Coesy 2010-11-23 05:56:32