日期:2014-05-17  浏览次数:20791 次

关于多线程操作,无法同步执行的疑惑
环境:VS2008+C#+WinForm程序
界面有一保存按钮,执行过程很费时,希望能给用户一些友好显示,自然想到要用进度条;
希望在执行主方法时,进度条也同时显示,并逐步增长的过程。现在主方法与进度条方法都已经写好,单独运行可以成功。但希望达到的效果始终无法实现。

1、进度条与主方法,都有可能涉及到对界面控件的操作,为防止出现<线程间操作无效: 从不是创建控件“”的线程访问它。>这样的错误,进度条主要代码采用了委托:
/// <summary>
/// 进度条委托方法
/// </summary>
/// <param name="ipos"></param>
        private void SetProgressBarDelegate(int ipos)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DelegateIntoInt(this.SetProgressBarDelegate), new object[] { ipos });
            }
            else
            {
                base.toolStripProgressBar1.Value = Convert.ToInt32(ipos);
            }
        }

此时,主方法没有采用进度条这种this.Invoke方式,如果不包含界面控件操作,运行正常。如果加上界面控件操作,就会报错<线程间操作无效: 从不是创建控件“”的线程访问它。>,然后如法炮制,将主方法也改成下面这种:
/// <summary>
        /// 执行主方法
        /// </summary>
        private void DoMainMethodDelegate()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new DelegateIntoNull(this.myMainMethod), new object[] { });
            }            
        }

在保存按钮的主要代码如下:
this.proBarThread = new Thread(new ThreadStart(this.SetToolStripProgressBar));
                this.proBarThread.Start();
                //执行主线程方法
                this.mainThread = new Thread(new ThreadStart(this.DoMainMethodDelegate));