我想问的是如果一个方法里有2段代码向下面这样
private void init()
{
    timer.start();
    Form f = new Form();
}
timer是一个定时器,用来运行一个进度条的,我的Form的构造函数里代码很多,会运行20.30秒吧,但是进度条每次都是要等界面实例化后才会出来,也就是说timer.start()方法会在整个方法运行后才会执行。不能用线程,因为界面里会用线程初始化很多控件,会出现一个线程创建的控件不能作为另一线程创建控件的父级这种错误,大家有什么好方法吗?

解决方案 »

  1.   

    程序是顺序执行的,并不是说timer.start()在整个方法运行后才会执行,而是Form f = new Form();的构造函数执行时间太久,看上去好像是在整个方法运行后才执行的样子
      

  2.   

    换个位置
        Form f = new Form();
        timer.start();
      

  3.   

    BackgroundWorker 可以考虑下看看
      

  4.   

    BackgroundWorker我倒是用了,但是依然会出同样问题,代码调换位置不行,我需要那样执行的,委托的话貌似也不可以,因为我初始化界面的时候会有一个委托调用的线程。
      

  5.   

    这个是我刚开始的代码   
     public partial class LoginLoading : Form
        {
            public static MainForm mainForm;        public static bool isLoad = true;        private Thread progressBarThread;        private int progressBarValue = 1;        private bool flag;        public LoginLoading()
            {
                InitializeComponent();
            }        private void LoginLoading_Load(object sender, EventArgs e)
            {
                progressBarThread = new Thread(RunProgressBar);
                progressBarThread.Start();
                this.backgroundWorker.RunWorkerAsync();
            }        private void RunProgressBar()
            {
                flag = true;
                while (flag)
                {
                    this.progressBar.Value = progressBarValue;
                    progressBarValue++;
                    Thread.Sleep(200);
                }
            }        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
            {
                if (mainForm == null)
                {
                    mainForm = new MainForm();
                }
                flag = false;
                this.progressBar.Value = 100;
                Thread.Sleep(100);
            }        private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                this.Hide();
                Thread.Sleep(500);
                mainForm.Show();
            }
        }
         
        public partial class MainForm : Form
        {
      public MainForm()
            {
         MainForm_Load(null,null);
            }

    public void MainForm_Load(object sender, EventArgs e)
            {
                if (LoginLoading.isLoad)
                {
                   LoginLoading.isLoad = false;
                   Thread thread = new Thread(new ThreadStart(initControl));
                   thread.IsBackground = true;
                   thread.Start();
                }
            }    
            
            public void initControl()
            {
                if (control == null)
                {
                    pnlMain.Invoke((EventHandler)(delegate
                    {
                        control = new Control();
                    }));
                }
            }   
        }在主页面中我点击某个按钮,添加某个控件时候一样会出一个线程创建的控件不能作为另一线程创建控件的父级这种错误。
      

  6.   

    直接show 你的进度条就可以了。不要用showdialog
      

  7.   

    直接show 你的进度条就可以了。不要用showdialog