zoukankan      html  css  js  c++  java
  • C# 关于跨线程访问控件问题

    跨线程访问控件问题的原因是:控件都是在主线程中创建的,而系统默认控件的修改权归其创建线程所有。在子线程中如果需要直接修改控件的内容,需要使用委托机制将控件的修改操作交给主线程处理。因此,当没有使用委托机制而是直接在子线程中修改控件内容时,会引发控件安全问题,即跨线程访问控件问题。

    所谓跨线程调用控件就是一个线程调用另外一个线程的控件。

    常见使用情况,比如:当我们开了一个在后台监听消息的线程以后,需要将消息内容添加到主窗体的消息框内显示出来。

    这时候,我们就需要使用跨线程调用控件的方法。

    1.首先,声明一个委托,如:
    //修饰符 delegate 返回类型 委托函数名(有参/无参);
    public delegate void AddInfo_Delgegate(string message);
    2.创建委托函数对象,如:

    //添加消息到指定控件的函数
    private void AddInfo(string message)
    {
    this.richTextBox_Message.Text += message;
    this.richTextBox_Message.Text += " ";//换行
    }

    AddInfo_Delegate addinfo = new AddInfo_Delegate(AddInfo);

    3.在需要跨线程调用空间的地方,使用invoke方法:


    this.richTextBox_Message.Invoke(addinfoDelegate, DELEGATEMESSAGE);
    //this.richTextBox_Message 是需要添加消息的控件
    //invoke() 正如官方解释所说,在拥有此控件的线程上,调用指定参数列表执行委托。
    //invoke() 有两种参数模式,一是invoke(委托函数对象),二是带参类型invoke(委托函数对象,参数)
    ---------------------
    作者:linyujie0927
    来源:CSDN
    原文:https://blog.csdn.net/linyujie0927/article/details/72083227
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    利用后退按钮进行重复提交的解决办法。
    运用上传拦截器时遇到的一个问题
    Fckeditor上传图片的错误
    关于分页的一些经验。
    spring在web工程中的运用
    引入js失败的可能原因
    hql执行update行为时可能遇到的一个问题。
    Eclipse下freemarker插件的安装
    同名文本框与同名复选框在传值上的不同.
    spring在java工程中的运用
  • 原文地址:https://www.cnblogs.com/asdyzh/p/9876818.html
Copyright © 2011-2022 走看看