2014-02-26 26 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