preface:
单击按钮后,实时更改textbox控件值。
解决方法:
- 使用Timer控件
- 新建一个线程实时更新textbox值
多线程下更改非本线程创建的控件:
将引发异常:
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtcentgride”的线程访问它。”
原逻辑处理线程:
void readCentigradeThread()
{
while (true)
{
var centigrade = opcUaClient.ReadNode("ns=3;s="centigrade"");
txtcentgride.Text = centigrade.ToString();
}
}
当前线程调用非当前线程创建的控件将会引发异常。
更改代码如下:
void readCentigradeThread()
{
while (true)
{
var centigrade = opcUaClient.ReadNode("ns=3;s="centigrade"");
Invoke(new updateCentigradeTxtBoxDelegate(updateCentigradeTxtBox), new Object[] { centigrade.ToString() });
}
}
delegate void updateCentigradeTxtBoxDelegate(string text);
void updateCentigradeTxtBox(string text)
{
txtcentgride.Text = text;
}
应该先定义一个委托,再将委托的实例传入 Invoke方法中,如方法需要带参数,则将参数放入object数组中。



