下面是程序,执行到那一行就出错,我想是不是和多线程有关系。是不是一个竞态条件的问题?请高手指点一下!private void button1_Click(object sender, EventArgs e)
{
   System.Threading.Thread a = new System.Threading.Thread(new System.Threading.ThreadStart(Plus));
   a.Start();
}private void Plus()
{
   this.progressBar1.Value = 0;
   for (int i = 0; i < 1000; i++)
   {
      this.progressBar1.Value++;  //一执行到这里就出错
      System.Threading.Thread.Sleep(100);
      if (this.progressBar1.Value == this.progressBar1.Maximum)
      {
         MessageBox.Show("OK");
         return;
      }
    }
}

解决方案 »

  1.   

    不能在非UI线程中修改一个UI控件http://www.iwms.net/n1968c13p3.aspx看下这,搜索下挺多的
      

  2.   

    用委托!
    在线程中不能直接访问空间用委托,网络上有这样的例子.
    基本是路
    public delege void CallSetText(string txt);
    pub void SetText(string txt)
    {
      if (this.text1.isrequired)
    {
      this.text1.text=txt;
    }
    else
    {
      this.invken{
    }
    }
    }在你的线程里直接用SetText("232");
    或者Form.CheckForIllegalCrossThreadCalls = false;
      

  3.   

    楼上的那个delege是做什么的?
    和我的这个程序没有关系吧?
      

  4.   

    控件不能由创建它之外的线程访问。你想赋值必须的用委托来实现。在委托的函数里调用控件的Invoke。
      

  5.   


    private void button1_Click(object sender, EventArgs e) 

      System.Threading.Thread a = new System.Threading.Thread(new System.Threading.ThreadStart(Plus)); 
      a.Start(); 

    private delegate void  temp();
    private void Plus() 

      if(this.InvokeRequired )
          this.Invoke (new temp (Plus))//这里,跨线程
      else
      {
        this.progressBar1.Value = 0; 
        for (int i = 0; i < 1000; i++) 
        { 
          this.progressBar1.Value++;  //
           System.Threading.Thread.Sleep(100); 
          if (this.progressBar1.Value == this.progressBar1.Maximum) 
          { 
            MessageBox.Show("OK"); 
            return; 
          } 
        } 
      }
    }
      

  6.   

    多线程访问控件。线程无法访问UI具体可以参考:
    http://blog.csdn.net/gisfarmer/archive/2008/07/31/2745426.aspx