求解C#一个线程问题

mznxbc123456 2013-12-21 03:56:07
一个线程的程序刚开始跑的时候是可以的,但跑了一次现在又不行了,出现这样的问题,该怎么改呀?
控制灯来回变颜色的
private void startChange()
{
Thread threadChange = new Thread(new ThreadStart(changeLight));
threadChange.Start();

}

private void changeLight()
{
bool light = true;
while (light)
{
if (zuol1.BackColor == Color.White)
{
zuol1.BackColor = Color.Green;
Thread.Sleep(100);
}
else if (zuol1.BackColor == Color.Green)
{
zuol1.BackColor = Color.Red;
Thread.Sleep(100);
}
else
{
zuol1.BackColor = Color.White;
Thread.Sleep(100);
}
}
}

private void button2_Click(object sender, EventArgs e)
{
startChange();
}

...全文
223 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hunter103 2013-12-23
  • 打赏
  • 举报
回复
楼上N个正确答案了
zhantianyou 2013-12-23
  • 打赏
  • 举报
回复
.net 跨线程访问到UI的控件时,不能直接访问,详情看这个面的 http://zhidao.baidu.com/link?url=DJZgHHDxZ4YBRj5koZMlXVWv2A4cxVGf-zj_S2d-wQ5f300QG2sEAJyBspzPDvGczBqX0qQ9rlnoDyxARbRPUK
  • 打赏
  • 举报
回复
                        this.Invoke(new MethodInvoker(() =>
                        {
                            while (light)
                            {
                                if (zuol1.BackColor == Color.White)
                                {
                                    zuol1.BackColor = Color.Green;
                                    Thread.Sleep(100);
                                }
                                else if (zuol1.BackColor == Color.Green)
                                {
                                    zuol1.BackColor = Color.Red;
                                    Thread.Sleep(100);
                                }
                                else
                                {
                                    zuol1.BackColor = Color.White;
                                    Thread.Sleep(100);
                                }
                            }
                        }));
mznxbc123456 2013-12-23
  • 打赏
  • 举报
回复
引用 3 楼 bigbaldy 的回复:
两种方法,第一种简单但建议使用第二种

CheckForIllegalCrossThreadCalls = false;

Invoke((MethodInvoker)(() => {//更改颜色的代码 }));
你说的第一个方法是可以的,但第二个就不能了啊~这怎么回事呀
Invoke((MethodInvoker)(() => 
            {
                while (light)
                {
                    if (zuol1.BackColor == Color.White)
                    {
                        zuol1.BackColor = Color.Green;
                        Thread.Sleep(100);
                    }
                    else if (zuol1.BackColor == Color.Green)
                    {
                        zuol1.BackColor = Color.Red;
                        Thread.Sleep(100);
                    }
                    else
                    {
                        zuol1.BackColor = Color.White;
                        Thread.Sleep(100);
                    }
                }
            }));        
_学而时习之_ 2013-12-23
  • 打赏
  • 举报
回复

        private void changeLight()
        {
            bool light = true;
            while (light)
            {
               
                Color newColor=Color.Green;
                if (zuol1.BackColor == Color.White)
                {
                   newColor = Color.Green;                   
                }
                else if (zuol1.BackColor == Color.Green)
                {
                    newColor= Color.Red;
                }
                else
                {
                   newColor= Color.White;                    
                }  
                this.Invoke(Action(() =>
                {             
                   zuol1.BackColor=newColor;//只在需要操作界面的时候才用invoke/begininvoke
                   Thread.Sleep(300);//时间过短,有可能导致时间占用太多。因为Invoke本质上是由主线程的执行的
                }));
                
            }
        }
lyx266 2013-12-23
  • 打赏
  • 举报
回复

        private void changeLight()
        {
            bool light = true;
            while (light)
            {
                this.Invoke(new MethodInvoker(() =>
                {
                if (zuol1.BackColor == Color.White)
                {
                    zuol1.BackColor = Color.Green;
                    Thread.Sleep(100);
                }
                else if (zuol1.BackColor == Color.Green)
                {
                    zuol1.BackColor = Color.Red;
                    Thread.Sleep(100);
                }
                else
                {
                    zuol1.BackColor = Color.White;
                    Thread.Sleep(100);
                }                    
                }));
                
            }
        }
mznxbc123456 2013-12-23
  • 打赏
  • 举报
回复
引用 9 楼 hunter103 的回复:
楼上N个正确答案了
楼上的答案我都试过了,但都要把while语句去掉才可以。是不是我这样做本身就是个错误
bigbaldy 2013-12-21
  • 打赏
  • 举报
回复
两种方法,第一种简单但建议使用第二种

CheckForIllegalCrossThreadCalls = false;

Invoke((MethodInvoker)(() => {//更改颜色的代码 }));
飞小猪 2013-12-21
  • 打赏
  • 举报
回复
this.Invoke(new Action(() => { //这里放置操作界面UI的方法 }));
terrence1106 2013-12-21
  • 打赏
  • 举报
回复
需要用委托, this.label_AcciTime.Invoke( new MethodInvoker( delegate { label_AcciTime.Text = ""; ;//事件发生时间 })); label_AcciTime 换成你自己的控件即可。

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧