2014-02-26 28 views
0

所以我想在後臺代碼中運行的線程中更新我的TextBox,名爲「ServerDataArea」。asp.net textbox不更新後面的表格代碼

形式:

<asp:ScriptManager ID="ScriptManager1" runat="server"> 
</asp:ScriptManager> 
<asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
    <ContentTemplate> 
     <asp:TextBox id="ServerDataArea" TextMode="multiline" Columns="50" Rows="15" runat="server" Enabled="false" /> 
     <br /> 
     <asp:TextBox ID="Message" runat="server" ></asp:TextBox> 
     <asp:Button ID="SendMessage" runat="server" OnClick="appendMessage_Click" Text="Send" /> 
    </ContentTemplate> 
</asp:UpdatePanel> 

這是我的代碼後面怎麼做更新這個文本框:

public delegate void MyDelegate(string text); 
private MyDelegate d; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
    { 
     d = new MyDelegate(MyMethod); 
    } 

    // create connection 
    // ... 

    // create thread 
    if(Session["thread"] == null) 
    { 
     Session["thread"] = new Thread(new ThreadStart(RunReceiver)); 
    } 

    Thread receiverThread = (Thread)Session["thread"]; 

    if (!receiverThread.IsAlive) 
    { 
     receiverThread.Start(); 
     Debug.WriteLine("Receiver thread started!"); 
    } 
} 

/// <summary> 
/// receive messages from the server 
/// </summary> 
private void RunReceiver() 
{ 
    byte[] data = null; 

    while (con.GetClient().Connected) 
    { 
     // if stream contains data to recieve 
     if (con.GetStream().DataAvailable) 
     { 
      Debug.WriteLine("client receiving some data"); 

      // create new buffer to store received data 
      data = new Byte[256]; 

      // read data from stream 
      Int32 bytes = con.GetStream().Read(data, 0, data.Length); 

      // convert to readable text 
      responseData = System.Text.Encoding.ASCII.GetString(data, 0, bytes); 

      // display message in chat 
      d(responseData); 
     } 

     Thread.Sleep(400); 
    } 
} 

private void MyMethod(string text) 
{ 
    ServerDataArea.Text += text + "\r\n"; 
} 

中的Debug.WriteLine(ServerDataArea.Text)確實告訴我什麼應該是在可見文本框,但它是不可見的,我只是不知道如何使其可見..

回答

0

編輯 :(刪除雙層)您的代碼運行在單獨從控制UI線程分離線程,並且UI將只允許通過控件UI線程進行更新。

嘗試更新您創建的新線程之外的文本框值。

這是一個難以解決的問題,所以我建議你實現你想要的不同方式。

Taken from here 「從技術上說,你不應該由任何其他線程 訪問控制,除了創建它的一個。

從輔助線程訪問控制是無法保證,可能會奏效 ,但有時

相反,你應該定義一個委託並使用委託來調用 調用從輔助線程訪問您的 控件時,主線程我不知道這是否會加快更新,但這裏是你如何 將更新從另一個線程一個文本框的文本(VB警報):

編輯2:轉換VB函數C#

public delegate void SetTextDelegate(string sText); 

private SetTextDelegate SetText = new SetTextDelegate(SetTextBoxText); 

private void SetTextBoxText(string sText) 
{ 
    tbStatus.Text = sText; 
} 
+0

答覆謝謝,我更換了啓用=「假」只讀=」真「,因爲默認Enabled = true,但我得到相同的結果,文本框仍然是空白的。 – jt123

+0

說實話,在黑暗中有點刺,真正的問題是與你的線程有關,也就是說你的代碼在UI線程中運行在一個單獨的線程上,UI將只允許通過UI線程。 –

+0

好吧,所以我更新了代碼,向您展示瞭如何在添加委託時執行相應的代碼,但是我得到的結果相同,因此我必須在那裏做錯了什麼? – jt123