Как сказал Марк, вы хотите убедиться, что вы откручиваете новый поток, чтобы выполнить долгое вычисление. Таким образом, поток пользовательского интерфейса (который должен делать все обновления экрана) может перерисовывать панель progres всякий раз, когда вы изменяете процент завершения.
Важно отметить, что только Пользовательский интерфейс может обновлять интерфейс. Итак, как только вы работаете в отдельном потоке, вам нужно пройти дополнительный обруч, чтобы убедиться, что изменение пользовательского интерфейса обрабатывается в потоке пользовательского интерфейса. Если вы не уверены, какой поток вы используете, вы можете проверить значение InvokeRequired (если ваш класс является System.Windows.Form), чтобы узнать, действительно ли вы в потоке пользовательского интерфейса.
Чтобы обработать вашу команду в потоке пользовательского интерфейса, используйте функцию Control.Invoke(), чтобы убедиться, что обновление обрабатывается в потоке пользовательского интерфейса для элемента управления, с которым вы работаете.
В моем примере ниже я создаю тип функции делегата и заранее объявляю вызываемую функцию .... Я не делал этого ни с одной из классных функций C# 3.5, но я уверен, вы могли бы работать выражение lamba, чтобы сделать то же самое.
private void bCreateInvoices_Click(object sender, EventArgs e)
{
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(CreateInvoices);
worker.RunWorkerAsync(this);
}
// Here is the long running function that needs to update the progress bar
public void CreateInvoices(object sernder, DoWorkEventArgs e)
{
int totalChecked = CountCheckedServiceOrders();
int totalCompleted = 0;
foreach (...data to process...) {
totalCompleted++;
if (InvokeRequired) {
Invoke(new Change(OnChange), "status text",
totalCompleted, totalChecked);
}
}
}
// this code updates the status while a background thread works
private delegate void Change(string status, int complete, int total);
private void OnChange(string status, int complete, int total)
{
if (status == null) {
progressBar.Visible = false;
lStatus.Text = "Task complete";
progressBar.Value = 0;
} else {
progressBar.Visible = true;
progressBar.Minimum = 0;
progressBar.Maximum = total;
progressBar.Value = complete;
lStatus.Text = status;
}
}
Посмотрите на MSDN Control.InvokeRequired manual page и MSDN Control.Invoke manual page для некоторых больше информации.
я не знаю достаточно о C# здесь, чтобы ответить, но в Java Swing он должен иметь отдельный поток, иначе вы получите такое же поведение. – Chet