Как реализовать backgroundworker или threading in ASP.NET(C#) 4.0 веб-приложение для экспорта большого объема данных в excel?
Я хочу экспортировать некоторые сложные данные в лист excel, который занимает больше времени и блокирует приложение, так что пользователь не может двигаться дальше, пока эта задача не будет завершена, поэтому я использовал backgroundworker для этого, но все же он блокирует приложение, и пользователь должен ждать, пока функция экспорта не будет завершена. Есть ли какие-либо другие подходы, доступные для этого, или что я должен изменить в своем коде, чтобы реализовать его? для экспорта данных в excel я использую библиотеку ClosedXML и мое приложение работает на .net 4.0
Что я уже пробовал:
<%@ Page Title="" Language="C#" MasterPageFile="~/export_module.master" AutoEventWireup="true" CodeFile="GenerateReport.aspx.cs" Inherits="" Async="true" %> public readonly BackgroundWorker worker = new BackgroundWorker(); protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { worker.WorkerReportsProgress = true; worker.WorkerSupportsCancellation = true; worker.DoWork += new DoWorkEventHandler(DoWork); //worker.ProgressChanged += new ProgressChangedEventHandler(WorkerProgressChanged); worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(WorkerCompleted); } } protected void btn_Export_Click(object sender, EventArgs e) { if (!worker.IsBusy){ worker.RunWorkerAsync("ExportReport"); } } private void DoWork(object sender, DoWorkEventArgs e) { exportToExcel(); } private void WorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { } public void ExportReportWithHeaderClosedXML(string reportName, string fileName, DataTable dataTable) { int usedCells = dataTable.Columns.Count; string ReportDate = string.Empty; string attachment = "inline;filename=" + fileName + ".xlsx"; using (XLWorkbook wb = new XLWorkbook()) { //Add method of ClosedXML class library only accepts worksheet name of 31 characters. IXLWorksheet worksheet = wb.Worksheet(1); //Insert Report Data worksheet.Cell(4, 1).InsertTable(dataTable); HttpContext.Current.Response.Clear(); HttpContext.Current.Response.ClearContent(); HttpContext.Current.Response.ClearHeaders(); HttpContext.Current.Response.Buffer = true; HttpContext.Current.Response.ContentType = "application/vnd.ms-excel"; HttpContext.Current.Response.AddHeader("Content-Disposition", "inline;filename=" + fileName + ".xlsx"); using (MemoryStream MyMemoryStream = new MemoryStream()) { wb.SaveAs(MyMemoryStream); MyMemoryStream.WriteTo(HttpContext.Current.Response.OutputStream); HttpContext.Current.Response.End(); } } }