异步 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
方法吗?例如ExecuteReaderAsync
和GetResponseAsync
。
附注:您在方法中混合了所有内容 - 数据层 (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
Task.WaitAll(TaskList.ToArray());
在循环之后等待所有任务完成。
【讨论】:
以上是关于异步 asp.net 表的主要内容,如果未能解决你的问题,请参考以下文章