Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
xSCJx
22 / 19 / 6
Регистрация: 24.12.2012
Сообщений: 435
1

Работа с БД в отдельном потоке

17.03.2015, 00:48. Просмотров 830. Ответов 1
Метки нет (Все метки)

Привет. Я с C# не особо знаком, но так получилось, что нужно сделать прогу. Мне нужно чтобы при подключении к БД и выбора из нее значений, моя форма не зависала, а отображала прогресс бар. Понятно, что прогресс бар должен работать в UI потоке, значит работу с БД нужно вынести в отдельный поток. Помогите пожалуйста.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.03.2015, 00:48
Ответы с готовыми решениями:

Как выполнить запрос к базе в отдельном потоке
Расскажите новичку как сделать корректно запрос к базе в отельном потоке, чтобы...

Работа с БД в отдельном классе
Доброго времени суток, я новичок в С#, хотел бы узнать как вызвать из класса...

ProgressBar в отдельном потоке
Кинул на форму бутонку прогрессБар и тот элемент с не выговариваемым названием...

отрисовка графики в отдельном потоке
Привет! Я пишу тетрис на C# с использованием встроенной в .NET графики. В...

Выполнить код в отдельном потоке
Доброго времени суток уважаемые! Помогите пожалуйста разобраться с основами...

1
es_
210 / 209 / 114
Регистрация: 14.01.2013
Сообщений: 459
17.03.2015, 16:57 2
Лучший ответ Сообщение было отмечено xSCJx как решение

Решение

При использовании прогрессбара обычно пользуются BackgroundWorker'ом, что в принципе и есть отдельный поток
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
  public partial class Form1 : Form
    {
        BackgroundWorker bw;
 
        public delegate void _mBoxChange(string sText); // Это для асинхронной передачи данных на лейбл для примера
        public Form1()
        {
            InitializeComponent();
 
            progressBar1.Maximum = 21; // максимальное значение для прогрессбара (в моем случае 21 - количество получаемых строк из БД)
            progressBar1.Step = 1;  
 
            bw = new BackgroundWorker(); // будем выполнять в отдельном потоке
            bw.WorkerReportsProgress = true; // будем сообщать об этом (прогрессбару)
            bw.DoWork += new DoWorkEventHandler(bw_DoWork); // метод который будем выполнять в отдельном потоке
            bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); // будет выполняться событие при изменении прогресса 
            bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); // выполняем при завершении работы в отдельном потоке
        }
 
        private void ChangeText(string sText) // Это для асинхронной передачи данных на лейбл для примера
        {
            label1.Text += sText; 
        }
        void bw_DoWork(object sender, DoWorkEventArgs e) // собственно сам метод
        {
            _mBoxChange coch = new _mBoxChange(ChangeText); 
            OleDbConnection conn = new OleDbConnection();
            
            string filePath = "C:\\tempbd.mdb";
            conn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath ;
            conn.Open();
            OleDbCommand  comm =  conn.CreateCommand();
            comm.CommandText = "SELECT * FROM kpp_temp";
            OleDbDataReader rr = comm.ExecuteReader();
            int j = 0;
            while (rr.Read())
            {
                Thread.Sleep(100);
                for(int i=0;i<58;i++)
                {
                    label1.BeginInvoke(coch, new object[] { rr[i].ToString() + " " }); // передаем на лейбл через делегат полученные данные
                }
                label1.BeginInvoke(coch, new object[] { Environment.NewLine });
                j++;
                ((BackgroundWorker)sender).ReportProgress(j); // вызываем событие изменения прогресса
            }
            rr.Close();
            conn.Close();
        }
 
        void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            progressBar1.Value = e.ProgressPercentage; // при изменении прогресса в потоке, присваиваем прогрессбару процент выполнения метода в потоке
        }
 
        void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            Text = "Работа окончена";
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Text = "Работа выполняется";
            bw.RunWorkerAsync();
        }
    }
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.03.2015, 16:57

Очередь сообщений в отдельном потоке
В продолжение темы http://www.cyberforum.ru/csharp-net/thread811472.html Мне...

Использование WebClient в отдельном потоке
private void button2_Click(object sender, RoutedEventArgs e) { ...

Таймер не запускается в отдельном потоке
У меня есть поток, в котором в при определенных условиях должен запустится...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru