C# 如何从ASP.NET中运行的线程获取对页面的反馈?

C# 如何从ASP.NET中运行的线程获取对页面的反馈?,c#,asp.net,C#,Asp.net,所以我有一个界面,它只是一个大按钮,可以将一组数据从一个工具同步到另一个工具。问题是这需要很长的时间,一些用户还在想到底是怎么回事。因此,我想知道是否有一种方法,我可以把一些东西放在我的循环中,这样每有这么多的条目,它就会向页面发送一些东西,以更新它们的进度 目前它只是一个.aspx页面,后面有一个aspx.cs。Go按钮触发整个过程并调用Response。写了很多次(以及将相同的内容写入我创建的日志文件),但直到整个过程完成后,才会显示响应 请告知。我想你是在叫另一个班来做这项工作。让我们称之

所以我有一个界面,它只是一个大按钮,可以将一组数据从一个工具同步到另一个工具。问题是这需要很长的时间,一些用户还在想到底是怎么回事。因此,我想知道是否有一种方法,我可以把一些东西放在我的循环中,这样每有这么多的条目,它就会向页面发送一些东西,以更新它们的进度

目前它只是一个.aspx页面,后面有一个aspx.cs。Go按钮触发整个过程并调用Response。写了很多次(以及将相同的内容写入我创建的日志文件),但直到整个过程完成后,才会显示响应


请告知。

我想你是在叫另一个班来做这项工作。让我们称之为工人阶级

您可以让WorkerClass将一个事件连接到它,.aspx页面也连接到它,并在触发事件时写入一条消息

// Overload EventArgs to send messageas back up
public delegate void UpdateMethod(object sender, EventArgs e);

public class WorkerClass
{
    public event UpdateMethod UpdateMethod;
}

WorkerClass worker = new WorkerClass();

worker.UpdateMethod += new UpdateMethod(worker_UpdateMethod);
根据评论进行编辑它在那里的页面上

如果你不想重构到另一个做这项工作的类(我建议)。您可以通过这种方式发布消息

protected override void Render(HtmlTextWriter writer)
{
    base.Render(writer);

    this.ProcessMassiveWorkLoad();
}

private void ProcessMassiveWorkLoad()
{
    for(int i = 0; i < 100000; i++)
    {
        // Do some work

        // Write the fact you have work
        Response.Write(string.Format("Done {0} of 100000", i);
    }
}
受保护的覆盖无效渲染(HtmlTextWriter)
{
base.Render(writer);
this.ProcessMassiveWorkLoad();
}
私有void ProcessMassiveWorkLoad()
{
对于(int i=0;i<100000;i++)
{
//做些工作
//写下你有工作的事实
Response.Write(string.Format(“Done{0}of 100000”,i);
}
}

您可以设计一个类,该类将存储在会话中,并表示操作的当前状态:

public class OperationState
{
    public object Result { get; set; }
    public int Progress { get; set; }
    public string Error { get; set; }
}

当您启动操作并将其存储在用户会话中时,可以创建此类的实例。然后,在操作的每个步骤中,您都可以从会话中检索该实例并更新progress属性。一旦操作终止,您可以设置Result属性或Error属性,以防发生异常。同时,您可以ould设计一个可从客户端脚本访问的实例。此方法只需从会话返回状态实例。然后,您将从javascript定期异步调用它以检查进度并更新DOM以通知用户。

解决问题的最简单方法是在每次
响应后调用。Write

这会将当前响应缓冲区刷新回客户端,使客户端能够查看页面的当前状态

即使是这种方法也需要这样才能及时地将响应发送给用户

更好的解决方案是按照解决方案的思路,这将涉及(比如)更新面板的一些客户端脚本,您可以使用JavaScript计时器刷新以获取最新状态,但这可能会给您带来其他问题(需要打开JavaScript,将长时间运行的方法重写为可以异步启动的方法,等等)


如果有什么安慰的话,我在过去已经做了这两件事,并且会再次使用这两件事。

完成这项工作的方法只是我添加到我的page类中的一个方法。我会重构到另一个类中。