所以我确实想要在代码后面运行的线程中更新名为“ServerDataArea”的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 :(得分: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;
}