Выполните действие в отдельном потоке, чтобы разблокировать интерфейс
У меня есть форма, которая используется для создания отчета. Мы используемRDLC
отчеты и отчет загружается вaspx
стр.
Так что это код дляForm
, цель формы установлена на_blank
и открывается в новой вкладке.
@using (Html.BeginForm("AssetReports", "AssetReports", FormMethod.Post, new { target = "_blank" }))
{
<div class="row mt-15">
<div class="col-md-12 text-center">
<input type="submit" class="btn btn-primary" value="Show Report" />
</div>
</div>
}
Это действие контроллера, которое перенаправляет на страницу отчета aspx, где отчет обрабатывается и отображается.
[HttpPost]
public void AssetReports(AssetReportsDTO model, AssetReportParametersDTO reportParameters)
{
SessionHandler.AssetReport = model;
SessionHandler.AssetReportParameters = reportParameters;
switch (model.SelectedReportType)
{
case AssetReportTypesEnum.ExcessiveIdleReport:
Response.Redirect("~/Reports/AssetReports/ExcessiveIdleReport/ExcessiveIdleReport.aspx");
break;
}
}
В некоторых случаях создание отчетов занимает 3,4 минуты. и в течение этого времени пользовательский интерфейс заблокирован,
Мы хотим, чтобы отчет создавался в отдельном потоке, чтобы пользователь мог использовать пользовательский интерфейс во время создания отчета.
Есть ли способ в MVC C # выполнить это действие в отдельном потоке?
Я попытался с помощью следующего, но затем контекст и сеансNULL
Task.Factory.StartNew(() =>
{
switch (model.SelectedReportType)
{
case AssetReportTypesEnum.ExcessiveIdleReport:
Response.Redirect("~/Reports/AssetReports/ExcessiveIdleReport/ExcessiveIdleReport.aspx");
break;
}
});
а также:
new Thread(() =>
{
switch (model.SelectedReportType)
{
case AssetReportTypesEnum.ExcessiveIdleReport:
Response.Redirect("~/Reports/AssetReports/ExcessiveIdleReport/ExcessiveIdleReport.aspx");
break;
}
}).Start();
РЕДАКТИРОВАТЬ
Код для создания отчета - это код, который занимает от 3 до 4 минутExcessiveIdleReport.aspx
public partial class ExcessiveIdleReport1 : Page
{
private IReportsProvider _reportsProvider;
protected void Page_Load(object sender, EventArgs e)
{
_reportsProvider = new ReportsProvider();
if (!IsPostBack)
{
try
{
var reportDetails = SessionHandler.AssetReport;
var reportParams = SessionHandler.AssetReportParameters;
var sPath = Server.MapPath("../ExcessiveIdleReport/ExcessiveIdleReport.rdlc");
var dsExcessiveReport =
_reportsProvider.GetExcessiveIdleReport(reportDetails.CompanyId, reportDetails.AssetId, reportDetails.StartDate,
reportDetails.EndDate, reportParams.SelectedIdleTime * 60);
ExcessiveIdleReportViewer.ProcessingMode = ProcessingMode.Local;
ExcessiveIdleReportViewer.LocalReport.EnableHyperlinks = true;
ExcessiveIdleReportViewer.HyperlinkTarget = "_blank";
ExcessiveIdleReportViewer.LocalReport.DataSources.Add(new ReportDataSource("ExcessiveIdleReport", dsExcessiveReport.Tables[0]));
ExcessiveIdleReportViewer.LocalReport.DataSources.Add(new ReportDataSource("ReportHeaderDetails", dsExcessiveReport.Tables[1]));
ExcessiveIdleReportViewer.LocalReport.DataSources.Add(new ReportDataSource("ReportSummary", dsExcessiveReport.Tables[2]));
ExcessiveIdleReportViewer.LocalReport.ReportPath = sPath;
ExcessiveIdleReportViewer.LocalReport.EnableExternalImages = true;
ExcessiveIdleReportViewer.LocalReport.SetParameters(param);
ExcessiveIdleReportViewer.LocalReport.Refresh();
}
catch (Exception ex)
{
ErrorDiv.InnerText = string.Format("An error occured while generating the ExcessiveIdleReport, Please contact Support with following Message: [{0}] - [{1}]", ex.Message, ex.StackTrace);
ReportContentDiv.Visible = false;
ErrorDiv.Visible = true;
}
}
}
}
Я также пытался использоватьAjax.BeginForm
@using (Ajax.BeginForm("AssetReports", "AssetReports", new AjaxOptions() { HttpMethod = "POST", OnSuccess = "OpenReport"}, new { target = "_blank" }))
{
<div class="row mt-15">
<div class="col-md-12 text-center">
<input type="submit" class="btn btn-primary" value="Show Report" />
</div>
</div>
}
JS:
function OpenReport(response) {
var popup = window.open("about:blank", "_blank"); // the about:blank is to please Chrome, and _blank to please Firefox
popup.location = '/TBReports/AssetReports/ExcessiveIdleReport/ExcessiveIdleReport.aspx';
}
Я загружаю все другие страницы, используя Ajax:
Вот изображение кнопки «Показать отчет» на странице отчетов об активах, которая выполняет действие:
Но после нажатия этой кнопки другие элементы пользовательского интерфейса блокируются. например Я не могу загрузить вид сGroup Reports
пока отчет не будет сгенерирован.