Winforms StatusStrip - почему бывают периоды, когда он пуст, когда я обновляю его?

ПРЕДПОСЫЛКИ: у меня есть приложение WindowForms v3.5 с StatusStrip, установленным для использования в качестве TooStripStatusLabel. Я выпускаю довольно много обновлений для него во время выполнения задачи, однако бывают заметные периоды, когда она ЗАПУСКАЕТСЯ. Там также нет смысла, когда я пишу пробел на метку строки состояния либо.

ВОПРОС: Любые идеи, почему я бы увидел период, когда ярлык строки состояния пуст, когда я не ожидаю, что это будет?

Как я обновляю это:

    private void UpdateStatusStrip(string text)
    {

        toolStripStatusLabel1.Text = text;
        toolStripStatusLabel1.Invalidate();
        this.Update();
    }

PS. Вызов Application.DoEvents() после this.Update(), похоже, не помогает. Я на самом деле вызываю это через элемент управления backgroundworker, так что:

(а) Я запускаю фонового работника:

    private void Sync_Button_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
        DisableUpdateButtons();
    }

(б) фоновый работник вызывает обновления:

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
  backgroundWorker1.ReportProgress(1, "Example string");
  MainForm.MyC.SyncFiles(sender);
}

(c) Бизнес-класс MyC также использует его, например

public void SyncFiles(object sender)
{
    BackgroundWorker bgw = (System.ComponentModel.BackgroundWorker) sender;
    bgw.ReportProgress(1, "Starting sync...");
.
.
.
}

(d) Это событие поднимает это:

    private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        UpdateStatusStrip((string)e.UserState);
    }

(д) И снова полоса обновления состояния

private void UpdateStatusStrip(string text)
{
    toolStripStatusLabel1.Text = text;
    toolStripStatusLabel1.Invalidate();
    this.Update();
}

Это помогает?

1 ответ

Возможно, причина в вызывающей функции. Если вы вызываете его из другого потока, используйте Control.BeginInvoke вместо прямого вызова. Если вы вызываете его из основного потока приложения во время длительной обработки, попробуйте Application.DoEvents после вызова UpdateStatusStrip.

Другие вопросы по тегам