Лучший отвечающий
С# Мониторинг загрузки данных (progressBar).

Вопрос
-
Имеется 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