2015-08-08 56 views
3

我使用來自SQL查詢和多個Web請求(每行1個)的數據填充一個asp.net表(最多64行)。前4列快速填充,但最後2列每個Web請求需要6秒。我希望最後2列顯示加載gif,並在網絡調用完成後更新。由於憑證在Web通話中傳遞,我想在服務器端進行通話。Async asp.net表

此外,我想提出多個並行的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來填充他們完成時。我現在遇到的問題是,我試圖填充的單元格同時調用同一個表單,並且Web請求正在排隊。

+0

你可以嘗試使用'async'可用的方法 - 比如'ExecuteReaderAsync'和'GetResponseAsync'。 –

+0

單方面說明:您將方法 - 數據層(SQL),服務邏輯和UI(TableCells)中的所有內容混合使用。這絕對是一個不好的方法 – Disappointed

+0

你是否「擁有」你打電話的網絡請求,或者它是第三方?如果你擁有它,它可以被修改爲帶有分隔參數,這樣你就可以嘗試減少被調用的次數,無論是服務器端還是客戶端? –

回答

0

只是如果相關,

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循環,並把結果保存類型列表中<任務>列表任務列表。使用

Task.WaitAll(TaskList.ToArray()); 

等待循環後完成所有任務。

0

我最終創建了空web請求單元格的表。一旦加載頁面,客戶端將調用每個單元格的Web請求並更新單元格。我唯一無法弄清楚的是如何用一個網絡電話更新2個單元格,但解決方案就位。

感謝您的關注。