线程的一些感悟

背景:通过一个辅助线程计算出的一个值赋给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是点击事件时的线程。

 4.

Invoke和BeginInvoke的区别是什么????为什么有的地方要用Invoke才可以,BeginInvoke不能用??

Invoke是同步的,BeginInvoke异步。

原文地址:https://www.cnblogs.com/zhayunjia/p/3807792.html