黑马程序员技术交流社区

标题: C#多线程的调用问题 [打印本页]

作者: 于振发    时间: 2013-9-28 01:16
标题: C#多线程的调用问题
本帖最后由 于振发 于 2013-9-28 16:47 编辑

我第一次使用线程,有这么个问题:我再窗体上放了一个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); // 指定线程休眠的时间
            }
           
        }

谢谢各位了
作者: 许庭洲    时间: 2013-9-28 07:38
int i = 0;
private void Form1_Load(object sender, EventArgs e)
{
       //创建线程 需要System.Threading命名空间
       Thread t1, t2; // 说明为窗体类成员
       t1 = new Thread(new ThreadStart(BackgroundProcess));
       t1.Start();    //启动线程t1
}
/////////////////////////////////////////////////////////////////////////////////////////            
delegate void Del_Thread();//定义一个委托
///////////////////////////////////////////////////////////////////////////////////////
private void BackgroundProcess()
{
       while (true)
       {
              Function();
              Thread.Sleep(2000);
       }
}
///////////////////////////////////////////////////////////////////////////////////////////////
private void Function()
{
        if (this.listBox1.InvokeRequired)
        {
                Del_Thread del = new Del_Thread(BackgroundProcess);
                this.BeginInvoke(del);
        }
        else
        {
                i++;
                listBox1.Items.Add(i);
         }
}

作者: 淡忘回忆    时间: 2013-9-28 11:29
出错原因:线程的调用不能交叉
解决方法:
两种方法:
1.listbox.checkforillegalcrossthreadcalls=false;(不建议使用这种)
2.用委托的方法,楼上已经写了
作者: ☜⑦圊⑥慾➹沼    时间: 2013-9-28 12:35
我试了下沙发的方法,感觉跳入死循环了,出不来。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2