C# 如何在ASP.Net中使用后台工作程序

C# 如何在ASP.Net中使用后台工作程序,c#,asp.net,ajax,progress-bar,backgroundworker,C#,Asp.net,Ajax,Progress Bar,Backgroundworker,我想使用asp.net中的BackgroundWorker和ajax从数据库中获取数据并将其导出到excel中。单击“开始”按钮后,工作人员将开始从数据库加载数据,并在过程完成后将数据写入excel,excel将下载该数据。这些过程通过进度条显示使用 但httpcontext中的问题(可能是错误的),当单击开始按钮时,excel文件被创建,但它没有下载。请解决这个问题。 我给出了密码 protected void Page_Load(object sender, EventArgs e)

我想使用asp.net中的BackgroundWorker和ajax从数据库中获取数据并将其导出到excel中。单击“开始”按钮后,工作人员将开始从数据库加载数据,并在过程完成后将数据写入excel,excel将下载该数据。这些过程通过进度条显示使用

但httpcontext中的问题(可能是错误的),当单击开始按钮时,excel文件被创建,但它没有下载。请解决这个问题。 我给出了密码

 protected void Page_Load(object sender, EventArgs e)   
        {
            _backgroundWorker.WorkerReportsProgress=true;
            _backgroundWorker.WorkerSupportsCancellation = true;
            _backgroundWorker.DoWork += new DoWorkEventHandler(_backgroundWorker_DoWork);
            _backgroundWorker.ProgressChanged += new ProgressChangedEventHandler(_backgroundWorker_ProgressChanged);
            _backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_backgroundWorker_RunWorkerCompleted);              

        }

    protected void btnStart_Click(object sender, EventArgs e)
        { 
            if (!_backgroundWorker.IsBusy)
            {
                _backgroundWorker.RunWorkerAsync();
            }

        }

        void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            string display = "Message Pop-up!";
            ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + display + "');", true);
        }

        void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {        
            ProgressBar1.SetProgress(e.ProgressPercentage);

        }

        void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {        
            Start(ProgressBar1.Progress, _httpContext);
        }

        private void Start(Progress progress, HttpContext context)
         {
            ProductBussiness productBussiness = new ProductBussiness();
            DataTable dataTable = new DataTable();
            StringBuilder builder = new StringBuilder();
            Table htmltable=new Table();

            int Totalcount = productBussiness.GetCount();
            int page = Totalcount / 100;
            double progresPercent = 100.00 / page;
            for (int i = 1; i <=page; i++)
            {
                 dataTable = productBussiness.GetProductData(i);
                 int percent=(int)(i * progresPercent);
                _backgroundWorker.ReportProgress(percent, progress);

                progress.SetProgress((i * progresPercent)/100);
                if(i<=page)
                    ConvertToHtmlTable(dataTable, htmltable, builder, false, context);
                else
                    ConvertToHtmlTable(dataTable, htmltable, builder, true, context);

            }

        }

        #endregion           

        public StringBuilder ConvertToHtmlTable(DataTable dt, Table table, StringBuilder builder, bool end, HttpContext context)
          {
                   if (dt.Rows.Count == 0)
                   {
                        return null;//`enter code here`
                   }

                   if (table != null)
                   {
                       foreach (DataRow r in dt.Rows)
                       {
                           builder.Append("<tr align='left' valign='top'>");
                           foreach (DataColumn c in dt.Columns)
                           {
                               builder.Append("<td align='left' valign='top'>");
                               builder.Append(r[c.ColumnName]);
                               builder.Append("</td>");
                           }
                           builder.Append("</tr>");
                       }
                   }
                   if (end)
                   {
                       context.Response.Clear();
                       StringBuilder str1 = new StringBuilder();

                       str1.Append("<html>");
                       str1.Append("<head>");
                       str1.Append("<title>");
                       str1.Append("Page-");
                       str1.Append(Guid.NewGuid().ToString());
                       str1.Append("</title>");
                       str1.Append("</head>");
                       str1.Append("<body>");
                       str1.Append("<table border='1px' cellpadding='5' cellspacing='0' ");
                       str1.Append("style='border: solid 1px Silver; font-size: x-small;'>");
                       str1.Append("<th align='left' valign='top'>");
                       foreach (DataColumn c in dt.Columns)
                       {
                           str1.Append("<td align='left' valign='top'><b>");
                           str1.Append(c.ColumnName);
                           str1.Append("</b></td>");
                       }
                       str1.Append("</tr>");

                       str1.Append(builder);

                       str1.Append("</table>");
                       str1.Append("</body>");
                       str1.Append("</html>");

                      context.Response.ClearContent();
                      context.Response.ClearHeaders();
                      context.Response.BufferOutput = true;

                      context.Response.AddHeader("content-disposition", "attachment;filename=ExportData1.xls");
                      context.Response.Charset = "";
                      context.Response.ContentType = "application/vnd.xls";
                      context.Response.Write(str1);
                      // Response.Flush();
                      // Response.Close();
                      context.Response.End();

                   }

                return builder;
           }
多谢各位
Pandiyan

您将客户机和服务器问题混为一谈。。。服务器如何通知客户端这些更新?您需要查看一些通信机制(信号器或类似机制),或者客户端可以轮询状态更新,但目前来看,这不起作用。“如何在ASP.Net中使用后台工作程序?”-不要使用它。BackgroundWorker适用于WinForms和WPF,您不需要它,它只会让您感到困惑。已完成的事件将在已死亡且已被遗忘的页面对象上运行。