Я разрабатываю приложение Windows Forms в vС# express 2013. У меня есть элемент управления statstrip, где у меня есть метка и индикатор выполнения. Я хочу показать прогресс progressbar в метке, но он не обновляется со значением индикатора выполнения. он обновляется только тогда, когда индикатор выполнения завершен, т.е. когда значение равно 100, и задание завершено. Странно, что индикатор прогресса обновлен, но ярлык не... Любые идеи, что может происходить здесь? Кстати, я поднимаю событие прогресса в своем собственном коде, который обрабатывается, и прогресс соответственно обновляется... Спасибо
Я поднимаю событие ProgressTick в классе MGFDataHandler
if ((hundredthValue*progressMultiplier == lineCounter) || (lineCounter==totalLines))
{
//Raise the progress bar event!
EventHandler handler = ProgressTick;
if (handler != null)
{
handler(this, e);
}
progressMultiplier++;
}
Затем я обрабатываю его в windowsform следующим образом:
void msDataHandler_ProgressTick(object sender, EventArgs e)
{
var progress = (int)((MGFDataHandler)sender).progressMultiplier;
if (progress < 100)
{
this.progressStatusString.Text = "Progress: " + progress + "%";
this.progressBar.Visible = true;
this.progressBar.Value = progress;
}
else
{
this.progressStatusString.Text = "Done";
this.filterMSDataToolStripMenuItem.Enabled = true;
}
}
Функция, которая запускает все это, находится в событии windowsform_activated, а объект MGFDataHandler - это атрибут окна.
private void GlycoMSPipelineMainFrame_Activated(object sender, EventArgs e)
{
switch (this.whoActivatedMe)
{
case WhoActivatedMe.MSFilterWizard:
{
this.whoActivatedMe = WhoActivatedMe.Me;
foreach (String currentmgffilename in this.currentMGFFileNames)
{
mgfDataHandler.Filter_MS_Data(currentmgffilename);
}
this.populateTreeViews();
break;
}
default:
{
break;
}
}
}
Это событие Filter_MS_Data вызывает событие.
Мне нужна дополнительная информация для полного ответа, но направление, в которое это направляется, мне совершенно понятно.
Проблема в том, что вы, вероятно, все делаете в одном потоке. Когда у вас есть большая работа, вам нужно использовать фоновый поток для выполнения работы, и пусть основной поток (т.е. поток пользовательского интерфейса) обрабатывает пользовательский интерфейс.
Это большая тема, и я просто царапаю поверхность здесь, поэтому прежде всего прочитайте следующие ссылки и попытайтесь создать поток для своей работы и сами запустите обновление панели выполнения. Если не удалось, отправьте новый вопрос с дополнительной информацией.
Ссылки, которые вы должны прочитать:
Попробуйте использовать фонового работника (найденного в System.componentModel) для выполнения выполняемой задачи. При обновлении метки или прогрессе вам нужно будет проверить, требуется ли invoke.
Что-то вроде этого.
If (label.InvokeRequired) {
label.Invoke(new MethodInvoker(delegate
{
label.Text = progress.Value;
});
}
Invoke необходим для предотвращения операций поперечной резьбы, которые, в свою очередь, могут привести к условиям гонки.
Простите форматирование, которое я напечатал на своем телефоне.
Вам нужно будет выполнить население, используя фонового работника. Я думаю, что это решит вашу проблему.
Изменение: рабочий стол выполняет рабочий процесс do, который будет работать в другом потоке. Он также предоставляет готовое событие, чтобы вы знали, когда задача будет завершена.
Я думаю, что здесь происходит то, что ваша программа выполняет работу над нитью ui, которая не позволяет полностью обновить ui.