2017-02-09 3 views
-1

Я пытаюсь получить значение поля моего текстового поля в потоковом классе, но значение всегда пусто. Я попытался проверить с точкой останова на отладчике, но он просто показывает, что «для оценки функции требуются все потоки».C# не удалось получить значение поля текстового поля при многопоточности

Я нашел this explanation на MSDN, но до сих пор не удастся получить значение текстового поля в классе threading.

Вот мое окно загрузки, чтобы запустить функцию резьбы:

//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 затем получить доступ к закрытому значение переменной вместо. Вы не должны обращаться к элементам управления пользовательского интерфейса через потоки, так как элементы управления пользовательским интерфейсом будут ВСЕГДА находиться в основном потоке, поэтому вы обязательно получите проблемы с доступом к элементам пользовательского интерфейса из потоков. Для чтения частной глобальной переменной, хотя это не должно вызывать слишком много проблем.

Как это:

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

Если вам необходимо обновить элемент управления пользовательского интерфейса, как ваш 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; 
    } 
} 
Смежные вопросы