【问题标题】:Running Something In a thread with feedback在有反馈的线程中运行某些东西
【发布时间】:2010-11-23 13:48:15
【问题描述】:

我编写了一个函数,它需要一大堆文件,将它们压缩起来,然后允许用户通过 asp.net 网站下载这个压缩包。

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

我希望得到一些关于如何在 c# 和 UI 方面最好地做到这一点的建议。

提前致谢。

【问题讨论】:

    标签: c# asp.net multithreading


    【解决方案1】:

    使用 Asynchronous Pages in ASP.NET 2.0

    由于担心页面回收,会话过期,您不能在 asp.net 中等待太久来完成任务,最好使用其他进程压缩这些文件并更新数据库中的标志或您的 zip 组件已准备好的专用网络中的某个地方!您的 asp.net 应用程序应读取此标志,然后让用户知道他们的 zip 已准备好下载。

    【讨论】:

      【解决方案2】:

      您可以使用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 仍然会在某个时候触发?跨度>
      【解决方案3】:

      【讨论】:

        【解决方案4】:

        BackgroundWorker 对象可能就是您要查找的对象。 这是一个很好的教程:http://dotnetperls.com/backgroundworker

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-17
          • 1970-01-01
          • 1970-01-01
          • 2019-04-06
          • 2020-01-15
          • 1970-01-01
          • 2019-04-08
          • 1970-01-01
          相关资源
          最近更新 更多