C#无法在多线程

时间:2017-02-09 08:34:55

标签: c# multithreading

我试图在线程类中检索我的文本框字段的值,但该值始终为空。我尝试在调试器上检查断点,但它只显示"函数评估需要所有线程运行"。

我在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);
    }
}

有什么方法可以解决这个问题吗?

2 个答案:

答案 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;
    }
}