none
С# Мониторинг загрузки данных (progressBar). RRS feed

  • Вопрос

  • Имеется DataGridView данные в MySQL.

    public void RefreshGrid(string name_grid)
        {
          switch (name_grid)
          {
            case "acc":
              DataSet info_user = new DataSet();
              DataSet data_mail = new DataSet();
              data_mail = Sql.ExecuteReader(connstr, "select login,email,realname from user_accounts");
              dgvusers.Rows.Clear();
              foreach (DataRow row in data_mail.Tables[0].Rows)
              {
                info_user = Sql.ExecuteReader(connstr, "select COUNT(*) from protected_destinations where mailuser = '" + row[1] + "'");
                string dest = info_user.Tables[0].Rows[0][0].ToString();
                if (dest == "0") { dest = "+"; } else { dest = "-"; }
    
                info_user = Sql.ExecuteReader(connstr, "select COUNT(*) from restricted_senders where usermail = '" + row[1] + "'");
                string send = info_user.Tables[0].Rows[0][0].ToString();
                if (send == "0") { send = "+"; } else { send = "-"; }
    
                dgvusers.Rows.Add(row[2], row[1], row[0], "нет", dest, send);
              }
              break;
    
            case "alias":
              DataSet info_alias = new DataSet();
              DataSet data_vmail = new DataSet();
              data_vmail = Sql.ExecuteReader(connstr, "select username,alias from user_aliases");
              dgvalias.Rows.Clear();
              foreach (DataRow row in data_vmail.Tables[0].Rows)
              {
                info_alias = Sql.ExecuteReader(connstr, "select email from user_accounts where login = '" + row[1] + "'");
                if (info_alias.Tables[0].Rows.Count == 1)
                {
                  dgvalias.Rows.Add(row[0], info_alias.Tables[0].Rows[0][0].ToString(), "доп.инф");
                }
                else
                {
                  dgvalias.Rows.Add(row[0], "логина " + row[1] + " не существует", "доп.инф");
                }
              }
              break;
          }
        }
    

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

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

    • Изменен тип Ruchkov Roman 30 марта 2011 г. 16:51
    30 марта 2011 г. 16:41

Ответы

  • Посмотрите BackgroundWorker, он специально предназначен для таких вещей.

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

     


    Don't forget to mark the correct answer Blog
    • Предложено в качестве ответа Oleksandr Reminnyi 30 марта 2011 г. 20:38
    • Помечено в качестве ответа Abolmasov Dmitry 7 апреля 2011 г. 8:54
    30 марта 2011 г. 20:37
  • Описание компонента BackgroundWorker и пример работы с ним можно посмотреть в документации MSDN - BackgroundWorker - класс


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 7 апреля 2011 г. 8:54
    3 апреля 2011 г. 18:01

Все ответы

  • Посмотрите BackgroundWorker, он специально предназначен для таких вещей.

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

     


    Don't forget to mark the correct answer Blog
    • Предложено в качестве ответа Oleksandr Reminnyi 30 марта 2011 г. 20:38
    • Помечено в качестве ответа Abolmasov Dmitry 7 апреля 2011 г. 8:54
    30 марта 2011 г. 20:37
  • Дело в том что для запуска потока я и использовал BackgroundWorker, он отображал изменения ProgressBar но во время загрузки данных главную форму я не мог таскать по экрану, это значит что форма вешалась... Не могли бы вы показать простой пример... Может быть я чего-то не до понимаю в структуре построения кода.
    31 марта 2011 г. 6:45
  • Используйте BeginInvoke при вызове методов формы, тогда окно не будет лочиться.
    31 марта 2011 г. 8:15
    Отвечающий
  • Скажите, вы меняли значение в прогрес баре прям из бекграунд потока?

    Это неправильно.

    Механизм предусматривает, что вы в UI потоке Вы подпишитесь на ProgressChanged бекграунд воркера, а в бекграунд потоке будете вызывать ReportProgress метод.


    Don't forget to mark the correct answer Blog
    • Предложено в качестве ответа Oleksandr Reminnyi 31 марта 2011 г. 11:08
    31 марта 2011 г. 11:07
  • Скажите, вы меняли значение в прогрес баре прям из бекграунд потока?

    Это неправильно.

    Механизм предусматривает, что вы в UI потоке Вы подпишитесь на ProgressChanged бекграунд воркера, а в бекграунд потоке будете вызывать ReportProgress метод.


    Don't forget to mark the correct answer Blog


    Да, как раз таки я так и делал, я запускал цикл в потоке и из этого цикла передавал параметры в progressBar.

     

    Можете подкинуть информацию по этому методу работы? Ссылку на документацию либо пример кода.

    2 апреля 2011 г. 9:21
  • Описание компонента BackgroundWorker и пример работы с ним можно посмотреть в документации MSDN - BackgroundWorker - класс


    Для связи [mail]
    • Помечено в качестве ответа Abolmasov Dmitry 7 апреля 2011 г. 8:54
    3 апреля 2011 г. 18:01