背景:通过一个辅助线程计算出的一个值赋给textBox1.text;
1.
当点击一个button事件 去触发一个while(1)的循环事件时,如果不用线程去操作 界面就会卡死
解决方法:需要加入线程。
2
然后发现在线程中去操作一个控件的显示(比如 textBox1.text=“”;)时会产生如下error:线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
解决方法:1直接在窗体的构造函数中加:System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 此时把所有的控件合法性线程检查全部都给禁止掉了。但是发现效果不是非常好。关闭exe时反应有点慢。
2通过代理委托解决private delegate void SetTextCallback(string text);
//在给textBox1.text赋值的地方调用以下方法即可
private void SetText(string text)
{
// InvokeRequired需要比较调用线程ID和创建线程ID
// 如果它们不相同则返回true
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text }); //当参数类型和个数都不确定的情况下,用object数组可以解决这个问题。
}
else
{
this.textBox1.Text = text;
}
}
通过委托的方法效果好。
3
关闭调试程序时,报错:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
解决方法: 加上Sgather.IsBackground = true;Sgather是点击事件时的线程。