2009-10-06 48 views
0

所以我有这个界面只是一个大的GO按钮,可以将一堆数据从一个工具同步到另一个工具。问题是需要很长的时间,一些用户不知道交易是什么。所以我想知道是否有一种方法可以在循环中放入一些东西,这样每一条条目都会发回一些东西给页面以更新它们的进度。如何从ASP.NET中正在运行的线程获取对页面的反馈?

目前它只是一个带有aspx.cs背后的.aspx页面。 Go按钮触发整个过程,它会调用Response.Write很多次(以及将相同的事情写入我制作的日志文件中),但在完成整个事件之前不会显示响应。

请指教。

回答

0

我假设你打电话给另一个班来完成这项工作。让我们称之为WorkerClass

您可以让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); 
    } 
} 
+0

做这项工作的方法只是我添加到我的页面类中的一种方法。 – BigOmega 2009-10-06 19:50:05

+0

我会重构到另一个类。 – 2009-10-06 19:54:06

2

你可以设计将被存储在会话类和将代表操作的当前状态:

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

当你开始操作这个类的一个实例可以创建并将其存储在用户会话中。然后在操作的每一步中,您都可以从会话中检索并更新进度属性。一旦操作终止,您可以设置Result属性或Error属性以防发生异常。在此期间,您可以设计一个可从客户端脚本访问的PageMethod。该方法将简单地从会话中返回状态实例。然后,您将定期和从JavaScript异步调用它来检查进度并更新DOM以通知用户。

0

解决问题的最简单方法是在每个Response.Write之后调用Response.Flush()

这将刷新当前响应缓冲区到客户端,使他们能够看到页面的当前状态。

即使是David's方法也需要这个以及时将响应提供给用户。

更好的解决方案是沿着Darin's解决方案,这会涉及某些客户端脚本(比如更新面板),您使用JavaScript定时器刷新以获取最新状态,但这可能会引入其他问题(需要打开JavaScript,将长时间运行的方法重写为可以异步触发的方法等)。

如果有任何安慰,我已经完成了过去,并会再次使用。

相关问题