循环直到后台线程完成

时间:2015-07-06 19:04:42

标签: c# multithreading backgroundworker

我为长期运行的任务创建了一个Form,它的目的是循环一个Progress Bar直到Thread完成。我将此表单显示为对话框,以便我的主应用程序等待,直到此表单返回。

不幸的是,我的RunWorkerCompleted在Thread实际完成任务之前被调用。

等待线程完成的有效方法是什么,没有加入?

public partial class FormProcessing : Form
{
    public ThreadStart StartTaskFunc { get; set; }

    public FormProcessing()
    {
        InitializeComponent();

        bgWorker.DoWork += bgWorker_DoWork;
        bgWorker.ProgressChanged += bgWorker_ProgressChanged;
        bgWorker.RunWorkerCompleted += bgWorker_RunWorkerCompleted;
        Shown += (s, e) =>
        {
            bgWorker.RunWorkerAsync();
        };
    }

    void bgWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        Close();
    }

    void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }

    void bgWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        var thread = new Thread(() => StartTaskFunc());
        thread.Start();
        int i = 0;
        while (thread.IsAlive)
        {
            if (i == 26)
                i = 0;
            bgWorker.ReportProgress(i);
            Task.Delay(200).Wait();
            i++;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您正在“bgWorker_DoWork”方法中创建另一个“线程”。

如果您创建另一个线程,则在创建新线程后立即完成“bgWorker_DoWork”。