为什么一个线程同步了UI线程后 这个线程就一直是RUNNING的状态
就是所谓的跨线程调用
用控件的Invoke方法实现的

解决方案 »

  1.   

    不太明白你说的是什么,更新UI的只能由主线程去更新,不能new Thread来更新的,必须委托给主线程去更新。
      

  2.   

    当然是了,win窗体有两种,窗体的核心代码是windows的消息循环和分配,其本身就是一个进程下的线程,核心代码是:getmessage   从CPU消息泵里取消息
               postmessage(可多线程) 重新投递消息
                 SendMessage (单线程,会形成阻塞) 执行该消息的响应如果你自己的线程代码,是在Sendmessage的窗体下执行的,那么就是死循环,很“忙”如果是在Postmessage的某一个过程中执行的,那么更多的是多个线程的交叉(同步、异步处理)
    给分吧,我要分下载
      

  3.   

     意思就是 我现在有个线程正在运行WINDOWS窗体 然后我又建立了一个线程,假设这个线程的名字是A,这个线程要改变WINDOWS窗体里一个控件的值 那么就是跨线程,要与创建这个控件的线程同步 也就是用INVOKE方法。。 然后同步完成并运行完后 应该返回线程A 然后线程A运行完后 那么他的状态就应该是STOPPed 可是线程A 运行完后  他的状态还是Running 意思是说他还在运行。。我就很郁闷 明明运行完了。 
    举个例子
    private void button3_Click(object sender, EventArgs e)
            {
                Thread th = new Thread(cc);
                th.Start();
                while (true)
                {
                    if (th.ThreadState == System.Threading.ThreadState.Stopped)
                        break;
                }
                
            }
            public delegate void weituo();
            private void cc()
            {
                if (button1.InvokeRequired)
                {
                    weituo a = new weituo(cc);
                    button1.Invoke(a);
                }
                else
                    button1.Text = "1";
            }
    调试下会发现th的状态就一直是Running状态, 怎么解决呢? 这个线程其实早就完了。  
      

  4.   

    我的意见,它需要一点时间来执行
    把你的代码增加一点Sleep看看:Thread th = new Thread(cc); 
                th.Start(); 
                Thread.Sleep(2000);            while (true) 
                { 
                    if (th.ThreadState == System.Threading.ThreadState.Stopped) 
                        break; 
                } 
      

  5.   

    Thread th = new Thread(cc); 
                th.Start(); 
                Thread.Sleep(2000);//给线程一点时间
                while (true) 
                { 
                    if (th.ThreadState == System.Threading.ThreadState.Stopped) 
                        break; 
                } 
    因为所有的线程启动后都进入系统线程池由操作系统调用分配CPU时间来执行
    你在线程启动后,主线程直接进入一个无限循环,抢了线程的CPU时间,所以你的线程执行就不顺畅,或者在等待CPU时间面没有执行完成,导致线程状态一直是running
      

  6.   

    private void cc()
            {
                if (button1.InvokeRequired)
                {
                    weituo a = new weituo(cc);
                    button1.BeginInvoke(a);
                }
                else
                    button1.Text = "1";
            } 
      

  7.   

    楼上是可以吧问题解决了,而开始关键是我要让BUTTON1的值改成1以后,然后再运行UI线程。所以要在BeginInvoke后加上 EndInvoke 那么就和Invoke的效果是一样的。