2017-02-09 47 views
-1

我試圖檢索我的文本框字段在線程類中的值,但該值始終爲空。我試圖檢查調試器上的斷點,但它只是顯示「功能評估需要所有線程運行」。C#無法檢索多線程文本框字段值

我在MSDN上發現了this explanation,但在檢索線程類上的文本框值時仍然沒有運氣。

這裏是我的窗口加載到啓動線程功能:

//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

你在加載事件中啓動線程?是已經在構造函數中設置的文本框文本? –

+0

在調用「Load」之前,該字段是否已被填充?另外,將字符串賦值移到循環中(我假設這只是爲了測試目的。) –

回答

2

看起來像只讀一次的文本框中的值(在窗口加載中)時,它仍然是空的,並且不會嘗試再次讀取它。

嘗試更新你的工作線程像這樣

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

爲什麼不創建一個大幹快上的OnTextBoxTextChanged更新私有變量(靜態?),然後訪問該私有變量值,而不是。你不應該通過線程訪問UI控件,因爲UI控件總是在主線程中,所以你一定會遇到從線程訪問UI控件的問題。閱讀一個私人的全局變量,儘管這不應該導致太多的問題。

像這樣:

private void OnTextBoxTextChanged(object sender, EventArgs e) 
{ 
    someGlobalVariable = ((TextEdit)sender).Text; 
} 

如果您需要更新UI控件,像一個線程的文本框 - 你需要檢查,如果線程的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; 
    } 
}