2014-02-10 46 views
1

我是一個很長一段時間的程序員,在過去一個月剛剛開始web開發。我在IIS 7.0上使用ASP.NET 4.0和C#。到目前爲止,我沒有遇到任何問題,並且已經實現了諸如JQuery之類的庫。在ASP.NET 4.0中執行冗長的函數

我正在慢慢學習網絡的方式,我習慣於頁面張貼和AJAX實現。我最近試圖添加功能到我的網站,即使在Stack Overflow和Google的幫助下,我也無法實現。

請允許我向框架問題:

我試圖創建一個Web表單,讓我點擊一個按鈕上的功能,然後對主機名和ping的列表服務器查詢數據庫結果中的每個名稱。每個循環處理ping,然後將結果寫入數據庫。一路上,雖然不是完全需要,但我有興趣從循環中檢索進度,以便用「Pinging SomeHostname ...」之類的信息更新頁面。

我嘗試過使用UpdatePanels,UpdateProgress和各種觸發器。在我的所有經驗中,頁面鎖定或在調試期間收到超時。

我最後的(非工作)解決方案是這樣的:

Web窗體:

<asp:UpdatePanel ID="PingUpdatePanel" runat="server" UpdateMode="Conditional"> 
     <ContentTemplate> 
      <asp:Button ID="btnPingAll" runat="server" Text="Ping All" OnClick="PingAll_Click"></asp:Button> 
      <asp:Timer ID="pingUpdateTimer" OnTick="pingUpdateTimer_Tick" Interval="1000" runat="server" /> 
      <div id="pingStatus" class="pingStatusBox" runat="server"> 
       <asp:Label ID="hostName" runat="server" Text="Initializing ping..."></asp:Label> 
      </div> 
     </ContentTemplate> 
     -- TRIGGERS HERE -- 
</asp:UpdatePanel> 

背後的代碼:

protected void PingAll_Click(object sender, EventArgs e) 
    { 
     Thread pingThread = new Thread(new ThreadStart(PingHosts)); 
     pingThread.IsBackground = true; 
     pingThread.Start(); 
    } 

    private void PingHosts() 
    { 
     //Get information DataTable 

     if (dataTable != null) 
     { 
      foreach (DataRow row in dataTable.Rows) 
      { 
       // Set label 
       hostName.Text = row[0].ToString(); 
       PingUpdatePanel.Update(); 

       // Ping stuff and update DB 
      } 
     } 
    } 

任何人都可以指向我如何在網絡中正確處理這個問題編程/ ASP.NET?此信息稍後可用於說明生成冗長的報告。

讓我知道如果我可以更清楚,我感謝任何幫助!

+1

SignalR .......? – danludwig

+1

檢查了這個http://stackoverflow.com/questions/857999/asp-net-update-ui-using-multi-thread –

+0

Danludwig,我需要兼容所有的方式回到IE7。 SignalR能夠走得遠嗎?我知道它使用HTML5。格斯,這將工作得很好,但不幸的是我需要從處理循環中取得進展。我無法執行計時器對象中的所有計算。 – ubertastic

回答

0

爲了實現這個,我最終創建了一個WebMethod的ping函數。從那裏,我將頁面加載的IP(如Jon P所建議的那樣)拖放到一個隱藏字段中,並在一個循環中使用JQuery AJAX來執行該功能。

$.ajax({ 
      type: "POST", 
      url: "PingIP.aspx/Ping", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      data: JSON.stringify({ "ipAddress": ipAddress }), 
      processData: false, 
      success: function (msg) { 
      } 
     }); 
0

我認爲你遇到的問題是,你正在執行與ui線程不同的線程上的代碼。所以你要麼需要跨線程通信(http://www.dreamincode.net/forums/topic/35616-cross-thread-communication-in-c%23/)或更新數據表並按照上面的註釋使用定時器讀取。

+0

在ASP.NET執行環境的上下文中,你的意思是什麼樣的UI線程? – Noseratio

+0

ASP.Net沒有UI線程。 – SLaks

+0

更新控件必須發生在創建UI元素的線程上。 –