Winform обновления для долгосрочных задач - PullRequest
5 голосов
/ 19 января 2010

Есть ли у вас хорошее решение для того, чтобы держать 'winform' нарисованным ', пока приложение выполняет долгосрочную задачу?

Я пытался использовать form.refresh () на каждом шаге, но есть несколько длительных запросов, что означает, что это не достаточно часто.

В основном это ТАК вопрос но на C # в Excel через VSTO (а не на Python).

Ответы [ 4 ]

3 голосов
/ 19 января 2010

Как упоминалось в statichippo, я бы использовал класс BackgroundWorker. Его цель - упростить многопоточность и позволить рабочему потоку выполнять трудоемкую обработку без блокировки графического интерфейса.

Вот цитата из MSDN :

Класс BackgroundWorker позволяет вам запустить операцию на отдельном, специальная тема. Кропотливый операции, такие как загрузки и базы данных транзакции могут вызвать ваш пользователь интерфейс (UI), чтобы казаться, как будто это перестал отвечать, пока они Бег. Когда вы хотите адаптивный интерфейс и вы столкнулись с длительными задержками связанные с такими операциями, Класс BackgroundWorker предоставляет удобное решение.

Вот хорошее руководство по использованию класса BackgroundWorker в формах Windows: Реализация многопоточности в WinForms с использованием класса BackgroundWorker

Существуют более сложные способы реализации многопоточности в C # для сложных сценариев, но для большинства простых сценариев BackgroundWorker прекрасно работает (по крайней мере, для меня).

Вот некоторые ссылки, которые я вытащил из Google на C # Multi Threading:
MSDN Threading
Введение в многопоточность в C #

1 голос
/ 19 января 2010

Другой вариант - использовать асинхронный делегат для отображения формы в потоке потоков.

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

Делегат Action (.NET 2.0+) используется вместе с методом BeginInvoke () для автоматического запуска кода делегата в потоке потоков.

Некоторые заметки:

  • Важно использовать Control.
  • Кроме того, m_pleaseWaitForm.ShowDialog(); фактически запускает новый цикл сообщений в новом потоке. Это то, что поддерживает форму «Пожалуйста, подождите».
  • Поскольку используется поток пула потоков, этот поток автоматически становится фоновым потоком и будет прерван, если основное приложение будет закрыто.
  • Помимо запуска в другом потоке, в Form2 нет ничего особенного. Вы можете разместить на нем любые дочерние элементы управления, такие как Pictureboxes, ярлыки и т. Д.
  • (MethodInvoker)delegate { ... } - это просто способ запуска кода в .NET 2.0 во встроенном делегате.

Пример, приведенный ниже, можно добавить в проект WinForms, содержащий Form1: основная форма и Form2: форма подождите.

   private Form2 m_pleaseWaitForm = null;

    private void Form1_Shown(object sender, EventArgs e)
    {
        // This code could also be placed in eg. a button click event handler.

        Action<Rectangle> a = new Action<Rectangle>(ShowPleaseWait);

        a.BeginInvoke(this.Bounds, null, null);

        // Do your long running tasks

        ClosePleaseWait();
    }


    private void ShowPleaseWait(Rectangle  bounds)
    {
        // This method runs on the new thread.

        m_pleaseWaitForm = new Form2();

        m_pleaseWaitForm.TopMost = true;
        m_pleaseWaitForm.Location = new Point(bounds.Left + bounds.Width / 2 - m_pleaseWaitForm.Width / 2, bounds.Top + bounds.Height / 2 - m_pleaseWaitForm.Height / 2);

        m_pleaseWaitForm.ShowDialog();

    }

    private void ClosePleaseWait()
    {
        m_pleaseWaitForm.BeginInvoke((MethodInvoker)delegate { m_pleaseWaitForm.Close(); });
    }
0 голосов
/ 19 января 2010

Вот хороший пример с кодом на C #.

Это специально для заставок, однако это почти идентичный процесс (возможно, за вычетом некоторой непрозрачности) для создания окна Please wait.

Ключевая информация заключается в том, что вам потребуется отдельная ветка. Это может усложнить ситуацию, однако статья дает хороший обзор / пример того, как это сделать правильно.

0 голосов
/ 19 января 2010

Использование BackgroundWorker

...