关闭

线程间操作无效

428人阅读 评论(22) 收藏 举报

    C#窗体界面,需要刷新窗体上的某一个控件,发现像平时开一个线程那样没办法运行,查了一下,存在线程串位,大概意思是说windows窗体控件本质上线程不是安全的,因为如果两个或者多个线程操作某一个控件状态,则可能会迫使控件进入一种不一致的状态,甚至可能出现其他与线程相关的bug,最坏的情况就是争用无果,造成死锁,所以就出现了线程安全。
 
    如果在工作线程中去new一个thread去执行UI控件更新,这样不仅仅会给后台工作线程带来巨大的压力,而且导致UI控件的不安全更新,为了解决这个问题,网上给出了下面的例子。
    一开始的demo(普通的线程更新),代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void DoWork()
        {
            this.textBox1.Text = "说谁文本框呢?";
        }
        private void btnok_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(DoWork));
            thread.Start();
        }
    }
}</span>
    后来加入委托后的demo(将更新方法委托给了别的方法去执行),代码如下:
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public delegate void MyInvoke(string str1, string str2);//定义一个委托事件
        public void DoWork()
        {
            MyInvoke mi = new MyInvoke(UpdateForm);//把updateform方法委托给mi
            //“BeginInvoke”再创建控件的基础句柄所在线程上,用指定的参数异步执行指定委托
            this.BeginInvoke(mi, new object[] { "说谁是文本框呢?", "胡闹" });//后面的两个参数为mi对象的参数,执行委托
        }

        public void UpdateForm(string param1, string param2)//定义一个更新窗体方法
        {
            this.textBox1.Text = param1 + param2;
        }

        private void btnok_Click(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(DoWork));
            thread.Start();
        }
    }
}</span>

效果图如下:


 
0
1
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C# 线程间操作无效

转载出处 许多新学习C#的新手进行界面操作的时候,在启用新线程时操作界面元素经常会遇到的问题,我曾经也是,特此来分享下经验: 以下面小列子为例,给出这个问题的解决办法。下面的列子是以一个计...
  • htiannuo
  • htiannuo
  • 2016-08-17 11:57
  • 2080

线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~

线程间操作无效: 从不是创建控件“”的线程访问它。 听说2003里边不会,我不知道是不是这样的,反正一直都在用05~ 05里会出这个问题的,貌似是为了安全~ 哦,现在知道的解决方法有两个~ ...
  • dongzhe8
  • dongzhe8
  • 2015-05-17 18:34
  • 14757

线程间操作无效: 从不是创建控件的线程访问它

我们在用线程操作的时候,可能会出现异常:线程间操作无效: 从不是创建控件richTextBox1的线程访问它。因为windows窗体控件不是线程安全的,如果几个线程操作某一控件的状态,可能会使该控件的...
  • wangchao0605
  • wangchao0605
  • 2009-12-15 13:47
  • 13108

关于线程间操作无效的处理方法

最近碰到线程间操作无效,从不是创建空间的线程访问的解决方法的问题,我在Google上找到了原因,原来是在微软的vs2005引入了线程安全的概念,防止滥用线程从而导致找错误的效率降低以及系统的复杂度大大...
  • chengjian008
  • chengjian008
  • 2009-03-21 18:30
  • 1078

线程间操作无效: 从不是创建控件的线程访问它 解决方案

访问 Windows 窗体控件本质上不是线程安全的。如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态。还可能出现其他与线程相关的 bug,包括争用情况和死锁。确保以线程安...
  • xiven
  • xiven
  • 2009-09-20 13:06
  • 13007

线程间操作无效: 从不是创建控件“xx”的线程访问它

public partial class Form5 : Form { public Thread PBarThread; private delegate ...
  • zhishiheng
  • zhishiheng
  • 2015-01-16 13:34
  • 2422

解决 线程间操作无效: 从不是创建控件的线程访问它

下面是一个settext的方法。每个线程都要调用richbox.appendtext方法 ,而线程又无法去访问主线程。所以采用委托的方式   。 下面是代码         delegate...
  • q317379184
  • q317379184
  • 2012-08-01 11:26
  • 991

线程间操作无效: 从不是创建控件的线程访问它的三种解决方法

今天遇到这个问题,百度了下,把解决的方法总结出来。 我们在ui线程创建的子线程操作ui控件时,系统提示错误详细信息为: 线程间操作无效: 从不是创建控件“XXX”的线程访问它。   就我知道的有三...
  • jumtre
  • jumtre
  • 2015-04-07 22:59
  • 19517

线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~【转】

线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“”的线程访问它。 听说2003里边不会,我不知道是不是这样的,反正一直都在用05~ ...
  • yearHeaven
  • yearHeaven
  • 2017-04-27 19:20
  • 187

“线程间操作无效: 从不是创建控件的线程访问它”

经典解决“线程间操作无效: 从不是创建控件的线程访问它” 在编程中经常会遇到在一个按钮中执行复杂操作,并将复杂操作最后返回的值加入一个ListView或ComboBox中候选。这个时候程序会卡,当程...
  • hongkaihua1987
  • hongkaihua1987
  • 2012-04-09 00:36
  • 752
    个人资料
    • 访问:194383次
    • 积分:14688
    • 等级:
    • 排名:第937名
    • 原创:263篇
    • 转载:0篇
    • 译文:0篇
    • 评论:5724条
    和我联系
    菜鸟也有春天~
    博客专栏