Обновление статуса из длинной задачи в WebForms - PullRequest
0 голосов
/ 24 февраля 2020

Я занимаюсь разработкой приложения 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 , только нулевые или пустые значения. Как я могу получить эту информацию и написать на странице в методе таймера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...