我为长期运行的任务创建了一个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++;
}
}
}
答案 0 :(得分:0)
您正在“bgWorker_DoWork”方法中创建另一个“线程”。
如果您创建另一个线程,则在创建新线程后立即完成“bgWorker_DoWork”。