Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Оторвать функционал от GUI, чтоб GUI не висло


Автор: igsilya 20.10.2011, 20:31
Код

namespace NameSpace
{

    public partial class Form1 : Form
    {

        private void Button1_Click(object sender, EventArgs e)
        {
            Выполнить_Мега_Адскую_И_Долгую_Работу();
        }
    
    }

}


при этом пока работает функция GUI "не отвечает" и окошко не перерисовывается, хотя там идёт вывод в текст боксы на форме.
Очень хотелось бы видеть этот вывод и чтобы окно не вешалось.
Пробовал через потоки делать, но что-то не очень получается.

Автор: Fitc 20.10.2011, 21:13
BackgroundWorker смотри, тема заезжена, мог бы и погуглить

Автор: igsilya 20.10.2011, 21:46
Я делал бэкграунд воркера, и интернет лопатил. Проблема в том, что  нужно ещё изредка выдавать диалоговые окна из этого потока. Для этого их необходимо вызывать от имени основного потока GUI => снова та же проблема.

Код

namespace NameSpace
{
    public partial class Form1 : Form
    {

        void Выполнить_Мега_Адскую_И_Долгую_Работу()
       {
          .................................
          if (FolderDialog.ShowDialog() == DialogResult.OK)
                    {
                    ........................
       }   
        
        private void Button1_Click(object sender, EventArgs e)
        {
                         Выполнить_Мега_Адскую_И_Долгую_Работу();
        }
    
    }
}




если делать воркера, то он стопориться в месте вызова диалога,
если начинать делать инвоки типа 

Код

 void Выполнить()
       {
            if (this.InvokeRequired)
            {
                Invoke(new MethodInvoker(delegate() { Выполнить(); }));
            }
            else
            {
                ....................
            }
        } 


всё опять виснет

Автор: Ky7m 21.10.2011, 08:18
А может поменять логику работы программы. Почему пока не идет работа показать прогресс бар, а потом когда все данные расчитаются, то и заполните все поля, тем более для этого с использованием Worker не понадобится решать кросспотоковые проблемы.

Автор: igsilya 21.10.2011, 20:44
слишком большая программа, буду несколько дней переделывать логику.

Автор: boevik 21.10.2011, 22:23
Поставить Application.DoEvents() для обработки событий от пользователей и перерисовки формы.

Автор: igsilya 22.10.2011, 01:33
Цитата(boevik @ 21.10.2011,  22:23)
Поставить Application.DoEvents() для обработки событий от пользователей и перерисовки формы.

Спасибо, не знал об этой функции. Очень помогло.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)