2012-09-20 275 views
0

我有一個asp.net網站,其中包含一個線程,從WCF服務中獲取一些數據。該線程以無限循環運行,等待每次運行1秒鐘。現在我想在標籤中顯示它從WCF服務中獲得的東西。我將該標籤添加到UpdatePanel並調用.Update()方法。我沒有得到任何例外,但是,標籤根本沒有更新。這裏是我的代碼(簡化):asp.net UpdatePanel不更新

t = new Thread(new ThreadStart(() => 
{ 
    while (true) 
    { 
     Label1.Text = GetFromWCF() + " " + DateTime.Now.ToString(); 
     updatePanel.Update(); 
     Thread.Sleep(1000); 
    } 
} 
)); 

t.IsBackground = true; 
t.Start(); 

此代碼是在頁面的OnInit方法。 updatePanel看起來像這樣:

<asp:ScriptManager runat="server" ID="scriptManager" EnablePartialRendering="true"/> 
<asp:UpdatePanel runat="server" ID="updatePanel" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Label ID="Label1" runat="server" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

我是否缺少任何東西?也許我還應該告訴你,我對asp.net非常陌生。

回答

3

您不完全瞭解Ajax和UpdatePanel的工作方式。

事實上,客戶端的UpdatePanel通過發送一個請求,然後等待獲取它們,然後獲取數據更新客戶端,從服務器請求數據。瀏覽器必須發出請求才能獲取數據 - 服務器無法向瀏覽器發送任何數據,第一次瀏覽器請求它們。

命令updatePanel.Update();的意思是通知UpdatePanel有一個更新,在後的代碼後面 - 並且不像你想的那樣工作,不是僅僅因爲你調用它而發送數據到UpdatePanel。

即使你在帖子後做了這樣一個閉環,UpdatePanel正在等待連接完全關閉以顯示數據,所以像這樣的線程中的循環無法建立連接來發送數據。

爲了讓你的想法工作,醚創建客戶端一個計時器,索要數據每隔一定的時間,乙醚的東西彗星技術:使用觸發器Reverse AJAX with IIS/ASP.NET

+1

謝謝你的提示!我現在看到這是如何完成的。我沒有在一個線程中存在無限循環,而是每秒都有一個計時器。這個計時器調用更新,現在它工作! – Christian

2

嘗試。

<asp:UpdatePanel runat="server" ID="update" UpdateMode="Conditional"> 
    <ContentTemplate> 
     <asp:Label runat="server" ID="uiTime" /> 
     <asp:Button runat="server" ID="uiInternalButton" Text="Click" /> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="uiAsynch" EventName="click" /> 
     <asp:PostBackTrigger ControlID="uiInternalButton" /> 
    </Triggers> 
</asp:UpdatePanel> 
<asp:Button runat="server" ID="uiPostback" Text="Click" /> 
3

位遲到了,但你可以通過在UpdatePanel中實現一個Timer對象,然後使用定時器「OnTick」事件來更新標籤解決這個問題。您可能可以通過將所需的值輸出到全局變量和/或靜態實現來重新修改線程函數。

<asp:UpdatePanel ID="MyPanel" UpdateMode="Conditional" runat="server"> 
    <ContentTemplate> 
    <asp:Timer ID="MyTimer" OnTick="timer_tick" Interval="1000" runat="server" /> 
    <asp:Label ID="UpdateTextBox" Text="start" runat="server" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

protected void timer_tick(object sender, EventArgs e) 
{ 
    UpdateTextBox.Text = Convert.ToString(myThreadClass.counter); 
    MyPanel.Update(); 
} 
+0

考慮到我上次使用UpdatePanel時失去了多少睡眠,這讓我很煩心 - 我錯過了一直需要觸發器的事實!謝謝! – GPMorgan