【问题标题】:Ajax server process with live interface progress status?具有实时界面进度状态的Ajax服务器进程?
【发布时间】:2010-10-24 20:32:39
【问题描述】:

我有一个从远程站点检索 html 并对其进行解析的进程。我将几个 URL 传递到该方法中,因此我想对过程进行 ajaxify 处理,并在每次 URL 完成解析时给出屏幕通知。例如,这就是我想要做的:

List<string> urls = ...//load up with arbitary # of urls

foreach (var url in urls)
{
    string html = GetContent(url);
    //DO SOMETHING
    //COMPLETED.. SEND NOTIFICATION TO SCREEN (HOW DO I DO THIS)
}

public static string GetContent(string url)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
    request.Method = "GET";

    using (var stream = request.GetResponse().GetResponseStream())
    {
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            return reader.ReadToEnd();
        }
    }
}

在循环中的每次迭代中,我想显示 URL 已完成并继续进行下一个。我怎样才能做到这一点?

【问题讨论】:

    标签: c# .net asp.net ajax asp.net-ajax


    【解决方案1】:

    您需要担心的第一件事是(我假设)您正在 ASP.NET 代码中运行一个可能需要长时间运行的操作。当您遇到 IIS 超时时,这将成为一个问题。 (默认情况下,90 秒。)假设您正在处理十个 URL,每个 URL 需要 15 秒才能完成reader.ReadToEnd() - 您的代码将在第六个 URL 之后超时并被终止。

    您可能会想“我可以加快超时时间”,但这并不是一个好的答案;你还有时间压力。

    我解决此类问题的方法是将长时间运行的操作转移到独立的 Windows 服务中,然后使用 WCF 在 ASP.NET 代码和服务之间进行通信。 Service 可以运行一个线程池来执行请求以处理一组 URL。 (Here's an implementation 允许您对工作项进行排队。)

    现在,您可以从您的网页通过 AJAX 请求轮询状态更新。 ASP.NET 代码中的处理程序可以使用 WCF 从服务进程中提取状态信息。

    执行此操作的一种方法可能是为每个提交的工作单元分配一个唯一 ID,并将该 ID 返回给客户。然后,客户端可以通过发送 AJAX 请求来查询工作单元n 的状态。在服务中,保留工作单元的List 及其状态(locking 以适当避免并发问题)。

    public class WorkUnit {
       public int ID { get; set; }
       public List<string> URLs { get; set; }
       public int Processed { get; set; }
    }
    

     

    private var workUnits = new List<WorkUnit>();
    
    private void ExecuteWorkUnit(int id) {
        var unit = GetWorkUnit(id);
    
        foreach (var url in unit.URLs) {
             string html = GetContent(url);
             // do whatever else...
             lock (workUnits) unit.Processed++;
        }
    }
    
    public WorkUnit GetWorkUnit(int id) {
        lock (workUnits) {
             // Left as an exercise for the reader
        }
    }
    

    您需要填写方法来添加工作单元,返回给定工作单元的状态,以及处理线程池。

    我使用过类似的架构并取得了巨大的成功。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多