Winform обновляет на длительных задачах

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

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

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

5
задан Community 23 May 2017 в 12:03
поделиться

4 ответа

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

Это для разбрызгивания экранов специально, однако это практически идентичный процесс (возможно минус некоторые из беспутных непрозрачности), чтобы создать окно «Пожалуйста».

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

0
ответ дан 15 December 2019 в 01:01
поделиться

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

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

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

Некоторые примечания:

  • Важно использовать Control.Begininvoke для любых перекрестных вызовов GUI, таких как закрытие, пожалуйста, дождитесь в форме в ClosePlaseWait ().
  • также M_PLEASEWAITFORM.SHOWDialog (); фактически начинает новый цикл сообщения в новом потоке. Это то, что удерживает, пожалуйста, подождите форму живой.
  • Поскольку используется нить Threadpool, эта нить автоматически является фоновым потоком и будет прекращена, если основное приложение закрыто.
  • Помимо бега на другую нить, нет ничего особенного в формате2. Вы можете разместить любые детские элементы управления, такие как INTALBOCKES, ярлыки и т. Д.
  • (методинвокер) делегат {...} - это просто .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(); });
    }
1
ответ дан 15 December 2019 в 01:01
поделиться

Используйте фоновый работа

0
ответ дан 15 December 2019 в 01:01
поделиться

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

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

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

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

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

Вот несколько ссылок, которые я вытащил из Google на C# Multi Threading:
MSDN Threading
Introduction to Multithreading in C#

3
ответ дан 15 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: