Пользовательский интерфейс не обновляется, несмотря на использование BackgroundWorker - PullRequest
1 голос
/ 20 декабря 2010

Я устанавливаю .Text значение textbox, отключаю его и затем вызываю BackgroundWorker для выполнения длительной операции файловой системы.Текстовое поле не обновляется с новым текстовым значением примерно до половины операции BackgroundWorker.

Что я могу сделать, чтобы текстовое поле показывало новое текстовое значение как можно скорее?Соответствующий код ниже:

void BeginCacheCandidates()
{
    textBox1.Text = "Indexing..."; // <-- this does not update until about 20 to 30 seconds later
    textBox1.Enabled = false;
    backgroundWorker1.RunWorkerAsync();
}

void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
    //prime the cache
    CacheCandidates(candidatesCacheFileName);
}

void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
    textBox1.Text = "";
    textBox1.Enabled = true;
    textBox1.Focus();
}

Обновление: Я решил проблему.Это был код, не связанный с этим - я переопределил WndProc и он зацикливался ...

Ответы [ 3 ]

1 голос
/ 20 декабря 2010

Попробуйте вызвать изменение в текстовом поле, а не напрямую вызывать его.

textBox1.BeginInvoke(new MethodInvoker(() => { textBox1.Text = string.Empty; }));

Это приведет к тому, что изменение произойдет в потоке формы.

1 голос
/ 20 декабря 2010

Если нет какой-то детали, которую мне не хватает, разве ReportProgress не даст вам то, что вы хотите?

0 голосов
/ 20 декабря 2010

Используйте метод Form.Update() для принудительного обновления пользовательского интерфейса.

void BeginCacheCandidates()
{
    textBox1.Text = "Indexing..."; // <-- this does not update until about 20 to 30 seconds later
    textBox1.Enabled = false;
    this.Update(); // Force update UI
    backgroundWorker1.RunWorkerAsync();
}
...