我在一个点击事件里写
for(i=0;i<10000;i++)
{
 lable1.text=i.toString();
}
在运行时,其他控件无法使用,包括关闭都无法点击,就像卡住了,是线程的问题吗?怎样让其他的控件也能使用

解决方案 »

  1.   

    循环放到线程里或者在循环里加Application.DoEvent();for(i=0;i<10000;i++)
    {
     lable1.text=i.toString();
      Application.DoEvent();
    }
      

  2.   


    public partial class Form2 : Form
        {//申明委托
    delegate void LockWindowDelegate(bool enabled);
    //定义委托对象private LockWindowDelegate _lockWindow;
     public Form2()
    {
                InitializeComponent();
    //对象初始化            _lockWindow = new LockWindowDelegate(lochFunction);
    }
      private void startAsyncButton_Click(object sender, EventArgs e)
            {//异步调用1
                this.BeginInvoke(_lockWindow, true);
    //异步调用2             IAsyncResult iar= _lockWindow.BeginInvoke(true,null,null);
    //停止调用             _lockWindow.EndInvoke(iar);
            
            }  private void lochFunction(bool bol)
            {
                if (bol)
                {
                    this.startAsyncButton.Enabled = false;
                    this.cancelAsyncButton.Enabled = true;
                }
                else
                {
                    this.startAsyncButton.Enabled = true;
                    this.cancelAsyncButton.Enabled = false;
                }
            }
    }
      

  3.   


    加Application.DoEvent();算是一个简单的办法了,如果循环内容写多了,处理event就有延迟了
      

  4.   

    是的DoEvents消耗资源比较多,不建议使用,最好还是用委托和线程如果用DoEvents,建议不要每次循环都用,10次或100次用一次DoEventsfor(i=0;i<10000;i++)
    {
       lable1.text=i.toString(); 
       if(i%100==0)
       {
          Application.DoEvent();
       }
    }
      

  5.   

    新建一个线程循环,不在主线程里循环就行了。
    Application.DoEvent(); 不建议使用。
      

  6.   

    新建个线程,在里面做循环.需要改变label的属性时使用invoke