我试图在线程类中检索我的文本框字段的值,但该值始终为空。我尝试在调试器上检查断点,但它只显示"函数评估需要所有线程运行"。
我在MSDN上找到this explanation,但在线程类上检索文本框值仍然没有运气。
这是启动线程功能的Window Load:
//Read D6010 Status To Get Weight Value on D6020
ThreadStart readWeightRef = new ThreadStart(readWeightStatusThread);
Thread readWeightThread = new Thread(readWeightRef);
readWeightThread.Start();
这是我的线程类代码:
public void readWeightStatusThread()
{
string readStatus = (string)txtD6010Status.Invoke(new Func<string>(()=> txtD6010Status.Text));`
while (Thread.CurrentThread.IsAlive)
{
MessageBox.Show(readStatus);
}
}
有什么方法可以解决这个问题吗?
答案 0 :(得分:2)
从文本框中看到的问题看起来只有一次(在窗口加载中),当它仍然为空且不会再次尝试阅读时。
尝试将您的工作线程更新为此类
public void readWeightStatusThread()
{
while (Thread.CurrentThread.IsAlive)
{
string readStatus = (string)txtD6010Status.Invoke(new Func<string>(() => txtD6010Status.Text));
MessageBox.Show(readStatus);
}
}
答案 1 :(得分:2)
为什么不创建一个在OnTextBoxTextChanged上更新的私有变量(static?),然后访问私有变量值。您不应该通过线程访问UI控件,因为UI控件将始终位于主线程上,因此您必然会遇到从线程访问UI控件的问题。对于读取私有全局变量,虽然这不应该导致太多问题。
像这样:
private void OnTextBoxTextChanged(object sender, EventArgs e)
{
someGlobalVariable = ((TextEdit)sender).Text;
}
如果需要更新UI控件,比如线程上的TextBox,则需要检查线程是否与UI控件线程(主线程)匹配,如下所示:
private delegate void TextBoxDelegate(TextBox textBox, string text);
private void SetTextBox(TextBox textBox, string text)
{
if (textBox.InvokeRequired)
{
textBox.Invoke(new TextBoxDelegate(SetTextBox), textBox, text);
}
else
{
textBox.Text = text;
}
}