zoukankan      html  css  js  c++  java
  • winform中 跨线程启动UI

    C#的winform程序中,是不可以从UI窗口主线程之外的线程去直接操作窗口控件的。
    确切的解释是,不能从创建控件的线程以外的线程去处理控件的操作,比如修改属性等。
    以下是跨线程操作控件的报错信息:线程间操作无效: 从不是创建控件“textBox4”的线程访问它
    解决办法
    解决方案有两个:
    方法一,设定Control类的CheckForIllegalCrossThreadCalls属性为false,不检测跨线程访问。也可以对Form直接设定这个属性,Form也是Control子类,该窗口下的所有控件都不检测。
    方法二,通过Control.Invoke调用委托的方式来执行。
    如果有多个线程要同时操作控件的话,推荐使用方法二,比较安全一些,方法一在某些情况下会报错,比如UI线程对这个控件在控件表面绘图,还没释放时,子线程也对这个控件进行绘图,就会报错了。

    委托解决的使用方式
    textBox4.Invoke(.....) 或 textBox4.BeginInvoke(....)
    示例
    public delegate void InvokeDelegate();

    private void Invoke_Click(object sender, EventArgs e)
    {
    myTextBox.BeginInvoke(new InvokeDelegate(InvokeMethod));
    }

    public void InvokeMethod()
    {
    myTextBox.Text = "Executed the given delegate ";
    }
    -----------------------------------------------------------------
    因为你这个控件是主线程创建的,它依附于创建窗体的主线程.因此,要在子线程去访问占资源的类型,我们需要跨线程调用.textBox4.InvokeRequire用于判断是否需要跨线程,返回True为需要跨线程,此时你需要定义一个委托类来将一个含赋值语句的方法封装起来,通过textBox4.Invoke来调用这个委托.代码如下:
    public delegate void SetTextHandler(string text);
    private void SetText(string text)
    {
    if(textBox4.InvokeRequired==true)
    {
    SetTextHandler set=new SetTextHandler(SetText);//委托的方法参数应和SetText一致
    textBox4.Invoke(set,new object[]{text}); //此方法第二参数用于传入方法,代替形参text
    }
    else
    {
    textBox4.Text=text;
    }

    }
    那么fun2函数可以改写成:
    void fun2()
    {
    str1 = long.Parse(textBox1.Text);
    str2 = long.Parse(textBox2.Text);

    lock (this)

    for (long i = str2; i <= str1; i--)
    {
    sum1 = sum1 + i;

    }
    SetText( sum1.ToString());


    }
    注意那两句 str1 = long.Parse(textBox1.Text);也需要写成委托形式,读取数据的方法和赋值的方法类型.

    对于不可控的事情,保持乐观; 对于可控的事情,保持谨慎
  • 相关阅读:
    C++中几种字符串表示方法
    oracle11g卸载(win10)
    Dbvisualizer 连接oracle数据库
    严重: Exception starting filter struts2 Unable to load configuration.
    eclipse启动Tomcat服务输入http://localhost:8080/报404
    Tomcat内存溢出解决办法
    A Java Runtime Environment(JRE) or Java Development Kit (JDK) must be available in order to run Eclipse.
    Spring容器装配bean的方式
    Spring容器的基本实现
    spring环境搭建
  • 原文地址:https://www.cnblogs.com/baylor2019/p/12401743.html
Copyright © 2011-2022 走看看