Я создаю приложение WinForms на C #.Когда я нажимаю кнопку, должен происходить определенный поток событий:
- Нажмите кнопку
- Показать метку1
- Показать метку2
- Вызов функции для анализа строки, введенной пользователем ранее (это может занять некоторое время в зависимости от строки)
- Показать listBox1 и progressBar1
- backgroundWorker1.RunWorkerAsync
- backgroundWorker1_DoWork ()делает что-то x раз и сообщает о прогрессе каждый раз*
Но это не то, что на самом деле происходит.Когда я прослеживаю код и просматриваю форму, у него возникает несколько проблем.
- label1 и label2 фактически не появляются, пока не будет выполнен синтаксический анализ.
- progressBar1 только иногда обновляетсякак вызывается ProgressChanged.В других случаях он будет ждать до тех пор, пока не будет напечатано «DONE», и обновит все сразу.
- Каждый раз, когда progressChange () вызывается, вертикальная полоса прокрутки в listBox1 становится меньше, поэтому я могу сказать, что элементы добавляются, нотекст Предметов не появляется до тех пор, пока не напечатано «DONE».
Я новичок в использовании backgroundWorker, поэтому возможно, я просто не понимаю, как он должен функционировать.Но задержку показа ярлыков я просто не понимаю вообще.Нет ошибок, когда я прослеживаю код и строки, кажется, выполняются в правильном порядке.
У кого-нибудь есть идеи о том, что может быть причиной этих проблем?Буду признателен за любую помощь или совет.Я бы предпочел не публиковать свой код, просто потому, что его много, но если кому-то это нужно, чтобы лучше понять, просто lmk.
РЕДАКТИРОВАТЬ: Вот код.
private void button1_Click(object sender, EventArgs e){
label1.Show();
label2.Show();
String errMsg = parseString();
if (errMsg == ""){
listBox1.Items.Clear();
listBox1.Show();
progressBar1.Maximum = 100;
progressBar1.Step = 1;
progressBar1.Value = 0;
progressBar1.Show();
backgroundWorker1.DoWork += backgroundWorker1_DoWork;
backgroundWorker1.ProgressChanged += backgroundWorker1_ProgressChanged;
backgroundWorker1.RunWorkerCompleted += backgroundWorker1_RunWorkerCompleted;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.WorkerSupportsCancellation = true;
if (backgroundWorker1.IsBusy != true)
{
backgroundWorker1.RunWorkerAsync();
}
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
backgroundWorker1.ReportProgress(1, "Updating Devices");
for (int i = 0; i < 100; i++)
{
//todo: do stuff
//update progress
backgroundWorker1.ReportProgress(i, "Device:" + i);
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
listBox1.Items.Add(e.UserState);
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show("DONE");
}