Как улучшить пользовательский интерфейс в .Net Compact Framework, C #? - PullRequest
1 голос
/ 25 ноября 2010

У меня есть несколько WinForms в моем приложении.

В некоторых формах я загружаю другие формы, в которых есть много данных для отображения.

Поэтому, когда я нажимаю кнопку, чтобы загрузить эти формы, они занимают 9-10 секунд,

Я хочу улучшить это. Я слышал о фоновой ветке, но не знаю, как это использовать.

Означает ли нажатие кнопки, что мне делать, чтобы я мог сразу же увидеть свою форму, а обработка выполняется фоновым потоком?

Пожалуйста, направьте меня, чтобы я мог улучшить свой интерфейс.

Ответы [ 3 ]

0 голосов
/ 25 ноября 2010

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

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

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

Возможно, это не самое элегантное решение, но оно выполняет свою работу. Он использует System.Windows.Forms.Timer

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        timer1.Stop();
        //fill controls with data
    }

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

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

Редактировать: Следует отметить, что элементы управления winform не всегда хорошо работают с потоками. Приятной особенностью System.Windows.Forms.Timer (в отличие от System.Timers.Timer) является то, что он предназначен для приятной игры с элементами управления.

0 голосов
/ 25 ноября 2010

Если ваша проблема связана с заморозкой основной формы, вам нужно собрать данные в отдельном потоке, а не в основной форме.

Для этого вы можете сделать что-то вроде этого:

    BackgroundWorker worker;

    public Form1()
    {
        InitializeComponent();
        worker = new BackgroundWorker();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        //Collect data and open your second form here;
    }
0 голосов
/ 25 ноября 2010

BackgroundWorker прост в использовании.В основном вы подписываетесь на событие DoWork, именно туда вы помещаете свою работу, которая будет выполняться в отдельном потоке.И вы также подписываетесь на событие RunWorkerCompleted.Это будет поднято, когда ваш DoWork завершится.В этом методе вы просто привязываете данные, полученные методом DoWork.

Вы можете использовать событие DoWork для передачи данных между DoWork и RunWorkerCompleted.Вы также можете отменить работу, а также вы можете использовать RunWorkerCompleted eventArg, чтобы получить данные из DoWork, а также проверить свойство Error для обработки исключений.

Если у вас много данных, вы можете использовать пакетный процесс, чтобы получать данные для каждой партии и отображать их в вашем пользовательском интерфейсе.Вы можете показать, сколько всего записей будет извлечено, и прогресс из этого числа загружен 100 из 1000, загружено 200 из 1000 и т. Д., Чтобы информировать пользователя.Вы также можете предоставить опцию Отмена, чтобы пользователь мог остановить выборку.

При нажатии кнопки вы просто вызываете myBackgroundWorker.RunWorkerAsync ().это вызовет ваш обработчик DoWork, который будет выполнен в отдельном потоке, а не в основном потоке пользовательского интерфейса, поэтому ваш пользовательский интерфейс не будет замораживаться во время фонового рабочего DoWork.

Фоновый работник также поддерживает работу с отчетами.

...