A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© popoluno 中级黑马   /  2013-6-15 13:03  /  1786 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我第一次使用线程,有这么个问题:我再窗体上放了一个listBox1,创建了两个线程,我再线程中访问这个listBox1的时候,系统说不能跨线程调用控件,这怎么回事 ,怎么解决??
代码如下:
        private void Form1_Load(object sender, EventArgs e)
        {
            //创建线程 需要System.Threading命名空间
            Thread t1, t2; // 说明为窗体类成员
            t1 = new Thread(new ThreadStart(BackgroundProcess));
            t1.Start();    //启动线程t1
        }
        private void BackgroundProcess()
        {
            int i = 1;
            while (true)
            {
                // 向列表框增加一个项目
                listBox1.Items.Add("Iterations: " + i.ToString());

i++;
                Thread.Sleep(2000); // 指定线程休眠的时间
            }
           
        }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

4 个回复

正序浏览
public Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//加上这句话,关闭跨线程之间的检查。
        }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 无__畏 于 2013-6-15 17:00 编辑
  1. int i = 0;
  2.         private void Form1_Load(object sender, EventArgs e)
  3.         {
  4.             //创建线程 需要System.Threading命名空间
  5.             Thread t1, t2; // 说明为窗体类成员
  6.             t1 = new Thread(new ThreadStart(BackgroundProcess));
  7.             t1.Start();    //启动线程t1
  8.         }

  9.         delegate void FunDel();
  10.         private void BackgroundProcess()
  11.         {
  12.             while (true)
  13.             {
  14.                 Function();
  15.                 Thread.Sleep(2000);
  16.             }
  17.         }

  18.         private void Function()
  19.         {
  20.             if (this.listBox1.InvokeRequired)
  21.             {
  22.                 FunDel del = new FunDel(BackgroundProcess);
  23.                 this.BeginInvoke(del);
  24.             }
  25.             else
  26.             {
  27.                 i++;
  28.                 listBox1.Items.Add(i);
  29.             }
  30.         }
  31.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
微软自带的有线程间调用的检查,只要关闭这个就可以了,目前我就知道这一种方法
public 客户端()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭线程之间的检查,相信你应该知道这个位置,程序最上面
        }

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
Control.CheckForIllegalCrossThreadCalls = false;  //跨越线程调用windows控件
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马