侯锋's Blog

X_free's Blog 个人技术博客

侯锋ID:x_free
1313次访问,排名2万外好友12人,关注者5
沈稳,幽默
x_free的文章
原创 14 篇
翻译 0 篇
转载 6 篇
评论 5 篇
x_free的公告
专注DotNet技术!
----------------------
Ab07.cn
----------------------
转贴请注明Ab07.cn
最近评论
xiongxuanwen:学习!
谢谢!
奥本海墨·本·拉登:白宫是我家,美国姥他娘的。
ki1381:哈哈,有意思

加油~

有时间再弄点别的效果吧,比如添加边框什么的
x_free:转贴请注明ab07.cn
李哥:早就知道了,,现在玩LINUX
文章分类
    收藏
      相册
      Me
      朋友的站
      Ab07软件工作室
      blackangel
      WoYiGui's Blog
      存档
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 C#多线程窗体控件安全访问收藏

      新一篇: 在线图片处理

      C#多线程窗体控件安全访问

       


       

      C# 2.0 为了线程安全,不充许子线程直接访问窗体中的控件
      如果在子线程中直接访问说窗体控件,编译器会提示,控件不是
      由该线程创建的.


      那么在子线程中如何访问窗体中的控件呢?
      在窗体的构造函数中加入这一句
      Control.CheckForIllegalCrossThreadCalls = false;
      子线程就可以直接访问窗体中的控件了,不过这样线程是非安全的.
      而默认Control.CheckForIllegalCrossThreadCalls=true;(捕获线程错误调用)
      这时可以用Invoke

      如下:

       

      using System;
      using System.Collections.Generic;
      using System.ComponentModel;
      using System.Data;
      using System.Drawing;
      using System.Text;
      using System.Windows.Forms;
      using System.Threading;

      namespace Project2
      {
         

          
      public partial class Form1 : Form
          {
              
      private BackgroundWorker backgroundWorker1;

              
      protected delegate void UpdateControlText(string strText);//定义一个委托
              
      //定义更新控件的方法
              protected void updateControlText(string strText)
              {
                 
      this.label1.Text  = strText ;
                  
      return;
              }


              
      public Form1()
              {
                  
      //Control.CheckForIllegalCrossThreadCalls = false;

                  InitializeComponent();
              }


              
      private void button1_Click(object sender, EventArgs e)
              {
                  Thread ff 
      = new Thread( new ThreadStart ( x2));
                  ff.Start();
              }

              
      private void x1()//线程安全的访问窗体控件
              {
                  
      for (int i = 0; i < 1000; i++)
                  {
                      
      long xx = Convert.ToInt32(this.label1.Text);
                      
      if (this.InvokeRequired)
                      {
                          UpdateControlText update 
      = new UpdateControlText(updateControlText);//用更新控件的方法updateControlText实例化一个委托update
                          this.Invoke(update, Convert.ToString(++xx));//调用窗体Invoke方法

                      }
                      
      else
                      {
                          
      this.label1.Text = Convert.ToString(++xx);
                      }
                  }
              }

           }

       }

      发表于 @ 2008年05月15日 08:52:00|评论(loading...)|编辑

      旧一篇: C#题目130条

      评论

      #xiongxuanwen 发表于2008-06-12 14:42:16  IP: 219.239.6.*
      学习!
      谢谢!
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © x_free