Я пытаюсь использовать ProgressBar, который является новым для меня (возможно только асинхронное?)
Я следовал WPF-Tutorial и не встретил никаких проблем. Я просто поместил код здесь снова для удобства.
public partial class ProgressBarTaskOnWorkerThread : Window
{
public ProgressBarTaskOnWorkerThread()
{
InitializeComponent();
}
private void Window_ContentRendered(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.DoWork += worker_DoWork;
worker.ProgressChanged += worker_ProgressChanged;
worker.RunWorkerAsync();
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for(int i = 0; i < 100; i++)
{
(sender as BackgroundWorker).ReportProgress(i);
Thread.Sleep(100);
}
}
void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
pbStatus.Value = e.ProgressPercentage;
}
}
Так что я просто взял и использовал этот код, и с ним проблем нет. Теперь я пытаюсь использовать его в своем коде и просто изменил функцию worker_DoWork
следующим образом:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
while (this.ValueProgress < 100)
{
(sender as BackgroundWorker).ReportProgress(this.valueProgress);
Thread.Sleep(200);
}
}
В своем коде я импортирую список файлов, поэтому я установил this.ValueProgress в 0затем каждый раз, когда я импортирую файл, я делаю это. ValueProgress = 100 * NumberImportedFiles / TotalFiles;
Я также заметил в отладке, что моя функция worker_ProgressChanged
не работает во время импорта (но worker_DoWork
работает нормально). Тогда, только когда все файлы импортированы, worker_ProgressChanged
запускается много раз (кажется, что он просто запускает все изменения, которые были сделаны сразу).
Редактировать: Просто сделал еще один "глупый" тест:
Я сохранил исходный код, добавив условие, поэтому ProgressBar начнет двигаться после того, как я отредактирую ValueProgress:
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
if(this.ValueProgress==0)
{
i--;
}
(sender as BackgroundWorker).ReportProgress(i);
Thread.Sleep(100);
}
}
И этот код не работает, я имею в виду функцию worker_DoWork
работает правильно, я начинаю увеличиваться после начала процесса, но ProgressBar не двигается (worker_ProgressChanged не запускается).