背景中的线程C#

时间:2010-12-28 20:17:41

标签: c# multithreading

我想在我的程序运行某些功能时显示进度条。当用户单击button1时,此功能正在运行。我使用了在后台运行的tread,但在我的程序中,这个线程在程序完成运行此函数后运行。我怎么修理它?

private void button1_Click(object sender, EventArgs e)
{
    pr(sender,e);
}

public void pr(object sender, EventArgs e)
{
    if (... == DialogResult.OK)
    {
        if (...)
        {
            Thread wa = new Thread(new ThreadStart(this.lad));
            wa.IsBackground = true;

            timer1.Interval = 500;
            timer1.Start();
            wa.Start();

            if (... == DialogResult.OK)
            {//the rest of the function}
        }
    }
}

private void lad()
{
    int war = 10;

    if (this.progressBar1.InvokeRequired)
    {
        progressBar1.Invoke((Del)delegate
        {
            for (int i = 1; i <=10; i++)
            {
                this.progressBar1.Value = this.progressBar1.Value + war;
            }
        });
    }
    if (progressBar1.Value == progressBar1.Maximum)
    {
        timer1.Stop();
        MessageBox.Show("files saved");
    }
}

private void timer1_Tick(object sender, EventArgs e)
{
    ladowanie_paska();
}

2 个答案:

答案 0 :(得分:7)

我强烈建议重写代码以使用BackgroundWorker类;

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

这样可以更轻松地使用ProgressChanged事件更新用户界面

答案 1 :(得分:0)

另一种方法是,使用委托并使用progress baar函数多播同​​一个运行porcess的委托。 下面的代码中有相同的功能。

 private void BtnWatch_Click(object sender, EventArgs e)
    {
        tickerDelegate1 = new TickerDelegate(SetLeftTicker);
        Thread th = new Thread(new ThreadStart(DigitalTimer));
        th.IsBackground = true;
        th.Start();

    }
    private void SetLeftTicker()
    {

        label2.Text=DateTime.Now.ToLongTimeString();
    }


    public void DigitalTimer()
    {
        while (true)
        {
            label2.BeginInvoke(tickerDelegate1, new object[] {});
            Thread.Sleep(1000);
        }

    }

    private void BtnProgrss_Click(object sender, EventArgs e)
    {
       // progressBar1.Visible = true;

        if (_flag == true)
        {
            tickerDelegate1 += new TickerDelegate(AnimateProgBar);
            _flag = false;
        }
    }

    private void AnimateProgBar()
    {

       num += 5;
        if (num >= 100)
        {
            num = 0;
        }
        progressBar1.Value = num;
    }

    private void SetProgressBar()
    {

        while (true)
        {

            progressBar1.Invoke(tickerDelegate1, new object[] { });
            //Thread.Sleep(10);
        }
    }