Я занимаюсь разработкой приложения WebForms. Он выполняет длинную фоновую задачу для создания отчета. Во время выполнения задачи она отправляет сообщения о состоянии через метод обратного вызова. Когда он завершается, он создает файл отчета.
Я пытаюсь создать страницу WebForms с UpdatePanel , чтобы она постоянно обновляла сообщения о состоянии, которые вызывают длинную задачу, и когда он завершает, отправляет файл клиенту.
Вот код aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.cs" Inherits="PIWeb.index" Async="true" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"/>
<asp:Timer ID="Timer1" runat="server" Interval="2000" OnTick="Timer1_Tick"/>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
<ContentTemplate>
<asp:Button ID="botao" runat="server" OnClick="botao_Click" Text="Execute"/>
<br/>
<asp:Label ID="Label1" runat="server"/>
</ContentTemplate>
<Triggers>
<asp:PostBackTrigger ControlID="botao"/>
<asp:AsyncPostBackTrigger ControlID="Timer1"/>
</Triggers>
</asp:UpdatePanel>
</form>
</body>
</html>
, а вот код aspx.cs:
using System;
using System.IO;
using System.Configuration;
using ProcessoIntegral;
namespace PIWeb
{
public partial class index : System.Web.UI.Page
{
static string status;
protected void botao_Click(object sender, EventArgs e)
{
var filePath = PIRobot.Execute(s =>Session["status"] += $"{s}\n");
Response.ContentType = "Application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=report.pdf");
Response.WriteFile(filePath + ".pdf");
Response.End();
}
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = $"<br>{Session["status"]}<br>";
}
}
}
PIRobot .Execute получает метод обратного вызова Действие для отправки сообщений о состоянии, но я не могу получить фактические значения в методе Timer1_Tick , только нулевые или пустые значения. Как я могу получить эту информацию и написать на странице в методе таймера?