Я создал форму для длительных задач, цель состоит в том, чтобы петля Progress Bar до тех пор, пока Thread не завершится. Я показываю эту форму как диалог, чтобы мое основное приложение «Ожидание», пока эта форма не вернется.Looping до Background Thread Completes
К сожалению, мой 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++;
}
}
}
Похоже, вы должны просто использовать индикатор выполнения marquee, а не обычный индикатор выполнения, поскольку вы на самом деле не обновляете индикатор выполнения с любым значимым значением прогресса. – Servy
У меня хорошее предложение, однако мне все еще нужно держать форму открытой до тех пор, пока Тема не завершится, никаких предложений? Или вы говорите, что выполняете задачу в Thread Form, и просто показываете Marquee? –
Вы должны просто выполнять свою работу прямо в обработчике DoWork, а не создавать другой поток для этого. Поскольку вы создаете новый поток, который создает новый поток, а затем ждет его завершения. Просто не создавайте второй поток. – Servy