簡體   English   中英

C#無法在多線程上檢索文本框字段值

[英]C# unable to retrieve textbox field value on multi threading

我正在嘗試在線程類中檢索文本框字段的值,但該值始終為空。 我試圖檢查調試器上的斷點,但它只顯示“函數評估要求所有線程都運行”。

我在MSDN上找到了這種解釋 ,但是仍然無法在線程類上檢索文本框值。

這是我的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);
    }
}

有什么辦法解決這個問題?

看起來像這樣的問題:當它仍然為空時,您僅從文本框中讀取一次值(在“窗口加載”中),並且不再嘗試再次讀取它。

嘗試將您的工作線程更新為這樣的內容

    public void readWeightStatusThread()
    {
        while (Thread.CurrentThread.IsAlive)
        {
            string readStatus = (string)txtD6010Status.Invoke(new Func<string>(() => txtD6010Status.Text));
            MessageBox.Show(readStatus);
        }
    }

為什么不創建一個在OnTextBoxTextChanged上更新的私有變量(靜態?),然后訪問該私有變量值。 您不應該通過線程訪問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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM