在页面执行长时间运行的任务时写入多个文本行

本文关键字:文本 任务 执行 执行长 运行 长时间 | 更新日期: 2023-09-27 17:55:36

我写了一个asp.net页面,它打印了一些文本,如下所示:

protected void Page_Load(object sender, EventArgs e)
{
    Response.ClearContent();
    for (int i = 0; i <=100; i++)
    {   
        var isOk = DoSomeTask(i);
        context.Response.Write(string.Format("Step {0}: {1}",i, isOk ? "Success": "Error"));
        Thread.Sleep(4000);
    }
}

我遇到了一个问题,文本仅在页面成功加载时显示。如何在页面执行时呈现文本?

在页面执行长时间运行的任务时写入多个文本行

好吧,

我很早就阅读了您的问题,但没有回答,因为我担心我可能无法通过简洁的代码示例为您提供解决方案的建议。您将遇到相同的障碍,AJAX和处理程序(ashx),这两者都是完全相同的。

您有一些进程在服务器上工作,并且您希望在服务器上发生事情时继续反馈。

您最好的选择是发布-订阅模型 asp.net 在世界上SignalR就是这个词!看看官方资源here .

以下是步骤:

  1. 每当您在长时间运行的任务中执行工作的一部分时生成事件
  2. 设置响应步骤 1 中生成的事件的信号处理程序 (Hub)。
  3. 在 ASPX 页(客户端)中,与信号中心连接
  4. 客户端代码(在 setp 3 中设置)上处理事件(在步骤 2 中)时接收响应并更新页面。

您可以在服务器端设置信号处理程序并订阅长时间运行的处理任务

你有没有尝试过 Response.WriteSubstitution

我相信这与 ASP.NET 页面生命周期有关,并且只有在页面成功加载时才触发Page_load。如果您正在寻找在加载页面时输出文本的行为,我建议您考虑 Ajax 而不是 ASP.NET 默认事件处理程序。

https://msdn.microsoft.com/en-us/library/ms178472.aspx

页面加载 :执行所有请求通用的操作,例如设置数据库查询。此时,将创建并初始化树中的服务器控件,还原状态,并且窗体控件反映客户端数据。请参阅处理继承的事件,它发生在 ViewState 和 PostData 通过页面上创建的控件发送到所有服务器端控件 ASP.NET 之后。

预渲染:在渲染输出之前执行任何更新。可以保存对预呈现阶段的控件状态所做的任何更改,而在呈现阶段所做的更改将丢失。这是在页面状态呈现为 HTML 之前您有机会处理的最后一个事件。

页面初始化 :是在恢复视图状态和后数据之前触发的事件。

如果你看一下网页是如何工作的,它基本上首先在各种缓冲区中呈现页面,然后将缓冲区复制到客户端,然后客户端缓冲所有内容,直到它可以解析它。

你实际上可以看到发生了什么。您可以执行以下操作,而不是使用浏览器:

telnet localhost 80 (substitute with correct host + port)
GET / HTTP/1.0
[2x enter]

基本上,关键是HTTP并不意味着以您希望的方式成为流协议。 所以......解决这个问题的方法是使用AJAX和Javascript。

不幸的是,ASP.Net 也不意味着具有后台工作进程。解决方法是使用像Hangfire http://hangfire.io/这样的框架。将其与 AJAX 回调相结合,您就有了答案。

您的代码在服务器端执行。您需要一个客户端解决方案。一种选择是返回一个简单的页面,在该页面中使用ajax调用从服务器端检索数据,显示加载动画,直到调用完成。