[英]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.