异步 asp.net 表

Posted

技术标签:

【中文标题】异步 asp.net 表【英文标题】:Async asp.net table 【发布时间】:2015-10-31 15:56:13 【问题描述】:

我正在使用来自 SQL 查询和多个 Web 请求(每行 1 个)的数据填充一个 asp.net 表(最多 64 行)。前 4 列快速填充,但后 2 列每个 Web 请求需要 6 秒。我希望最后 2 列显示加载 gif 并在网络调用完成后更新。因为凭据是在网络调用中传递的,所以我想在服务器端进行调用。

另外,我想同时发出多个 Web 请求。我正在研究任务分配,但我不确定如何在分配特定列任务时让表格完成。

我不喜欢我这样做的方式,但是我还是编程新手,并且最熟悉 C# 和 asp.net。

现在它看起来像:

Ajax 页面

<div>
    <form id="ajaxForm" name="ajaxForm" runat="server">
        <asp:table id="aspTbl" runat="server" />
    </form>
</div>

c# 是:

//SQL Connection
SqlConnection con = new SqlConnection(System.Configuration.ConfigurationManager.AppSettings["webConfigConnection"]);
con.Open();
SqlCommand cmd = new SqlCommand("Select name, type, location, IP from tbl", con)
SqlDataReader sdr = cmd.ExecuteReader();

while (sdr.Read()


    //web requeststring
    sURL;
    sURL = "http://" + sdr.GetValue(4).ToString()  + "WebRequestURL";
    WebRequest request;
    request = WebRequest.Create(sURL);
    request.Method = "GET";
    WebResponse response = request.GetResponse();
    StreamReader Report = new StreamReader(response.GetResponseStream());
    string ReportString = Report.ReadToEnd().ToString();
    Response.Close();

    //Populate Table
    TableCell tc1 = new TableCell();
    TableCell tc2 = new TableCell();
    TableCell tc3 = new TableCell();
    TableCell tc4 = new TableCell();
    tc1.Text = sdr.GetValue(0).ToString();
    tc2.Text = sdr.GetValue(1).ToString();
    tc3.Text = sdr.GetValue(2).ToString();
    tc4.Text = sdr.GetValue(3).ToString();
    tc5.Text = ReportString.SubString(paramaters);
    tc6.Text = ReportString.SubString(other paramaters);
    TableCell[] tcRow = new TableCell[]  tc1, tc2, tc3, tc4, tc5, tc6 ;
    tr.Cells.AddRange(tcRow);
    asptbl.Rows.Add(tr);


目标是让 T5 和 T6 初始填充加载的 GIF,并在可用时使用子字符串异步更新。

编辑:2015 年 6 月 10 日

感谢您的建议。它适用于并行运行 Web 请求,但是它仍然要求它们在发布之前全部完成,我在周末意识到这不是我可以避免在服务器端运行它的事情。我将尝试让单元格为 Web 请求发出 jquery ajax 调用并更新单元格,以便第 1-4 列可以立即加载,第 5 列和第 6 列将在可用时填充。将提供有关其工作原理的更新。

编辑:2015 年 6 月 10 日 #2

我更新为将单元格填充为空,并且在完成命中调用的 ajax 调用后,我循环遍历单元格以使用 javascript 填充它们。我现在遇到的问题是,我试图填充的单元格同时大量调用同一个表单,并且网络请求正在排队。

【问题讨论】:

您可以尝试使用可用的async 方法吗?例如ExecuteReaderAsyncGetResponseAsync 附注:您在方法中混合了所有内容 - 数据层 (SQL)、服务逻辑和 UI (TableCells)。这绝对是一个糟糕的方法 您“拥有”您正在调用的网络请求还是第三方?如果您拥有它,是否可以对其进行修改以采用分隔参数,以便您可以尝试减少调用它的次数,无论是服务器端还是客户端? 【参考方案1】:

我最终创建了带有空 Web 请求单元格的表格。页面加载后,客户端调用每个单元格的 Web 请求并更新单元格。我唯一想不通的是如何通过一次网络调用更新 2 个单元格,但现有的解决方案有效。

感谢观看。

【讨论】:

【参考方案2】:

只要相关,

List<Task> TaskList = new List<Task>();   

Task PushRow(Table tbl, string name,string type,string location,string IP ) 
    Task.Run(()=>

       //Add code for webdownload and table row adding

    );

然后在while循环中调用这个函数并将结果存储在一个List类型的列表TaskList中。使用

Task.WaitAll(TaskList.ToArray());

在循环之后等待所有任务完成。

【讨论】:

以上是关于异步 asp.net 表的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 异步/等待第 2 部分

ASP.NET Ajax入门

线程静态、ASP.NET 和异步处理程序

详解 ASP.NET异步

ASP.NET MVC 4 异步加载控制器

ASP.NET MVC中使用异步控制器