起因:
在做程序的时候用到了进度条,原来就听说这个需要使用线程,但是我在写代码的时候发现做一个循环给进度条空间反复赋值进度条也是可以动的,但是如果鼠标点击了其他地方或者拖动窗体进度条就不能动了,于是决定改用线程,看了很多使用线程控制进度条的帖子,里面很多都提到了必须使用一个BeginInvoke的方法,其中看到最多的就是   Knight94(愚翁)的http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx 
其中就讲到如何使用,例如:
   MethodInvoker mi = new MethodInvoker( this.InvokeFun );
但是我根据提供的代码写了个简单的例程想看看在线程中调用控件究竟是如何出错的,代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
    Thread thdProcess = new Thread( new ThreadStart( ThreadFun ) );
    thdProcess.Start();
}private void ThreadFun()
{
    for( int i = 0; i < 100; i++ )
    {
        if( this.prgBar.Value < 100 )
        {
            this.prgBar.Value = prgBar.Value + 1;
            this.button1.Text = prgBar.Value.ToString();
        }
        Thread.Sleep( 100 );
    }
}
程序并没有用到委托和MethodInvoker 等,结果程序跑通了,并且并不妨碍用鼠标对窗体的拖动问题:
为什么这里的线程可以控制到窗体的空件呢?是因为线程函数和窗体的控件事件在同一个类下么?

解决方案 »

  1.   

    vs2003是可以的, 你的是vs2003还是vs2005呢
      

  2.   

    假如你是2003,那显然是可以的...
    如果你是2005,那只能解释为你用了这句话:
    Thread.Sleep( 100 );
      

  3.   

    我前两天刚做完了一个和你类似程序。之后发现了愚翁大哥的文章,但是我的这个简单点。
    就是建一个helper类,把进度条对象传到线程里,然后在线程循环里给进度天赋值。我也给愚翁blog上留言了。你可以试试下面这个。
    工作线程类: 
    public class CommissionHelper 

    private System.Windows.Forms.ProgressBar proBar; 
    public CommissionHelper(System.Windows.Forms.ProgressBar proBar) 

    this.proBar=proBar; 

    public void Run() 

    int i=1; 
    for() 

    proBar.Value=i; 
    i=i+1; 


    } 主线程窗体按钮调用: 
    private void btnTransfer_Click(object sender, System.EventArgs e) 

    CommissionHelper helper=new CommissionHelper(proBar); Thread tdh=new Thread( new ThreadStart( helper.Run ) ); tdh.Start(); 

    哦,看到愚翁的回复了。
    你也可以到http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx 
    这里看看关于大漠狂沙的回复。
      

  4.   

    try
    http://www.codeproject.com/csharp/PIEBALDProgressDialog.asp
      

  5.   

    顶,但是操作TreeView还有ListView这些就必须用BeginInvoke()