2016-12-10 14 views
-2

У меня есть беспорядок с попыткой чтения строки за строкой из базы данных MS Access и отображения ее на экране, когда между каждым дисплеем есть несколько секунд сна.Как задержать мою программу при чтении из базы данных C#

Я использую System.Threading, как вы можете видеть, но кажется, что спать происходит до того, как программа отображает записи, а когда спящий закончен, отображается только последняя запись без отображения предыдущего.

Вот мой код, я буду очень признателен за любую помощь!

private void com_start_Click(object sender, EventArgs e) 
{ 
    try 
    { 
     string ConString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;"; 

     OleDbConnection Con = new OleDbConnection(ConString); 
     Con.Open(); 

     check_connection.Text = "succeeded"; 

     OleDbCommand command = new OleDbCommand(); 
     command.Connection = Con; 
     command.CommandText = "Select * From words"; 

     OleDbDataReader reader = command.ExecuteReader(); 

     if (reader.HasRows) 
     { 
      while (reader.Read()) 
      { 
       lab_word.Text = reader["word"].ToString(); 
       lab_definition.Text = reader["definition"].ToString(); 
       Thread.Sleep(30000); 
      } 
     } 

     reader.Close(); 
     Con.Close(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("Error " + ex); 
    } 
} 
+1

Когда вы спите вы спите в потоке пользовательского интерфейса. Тогда на экране ничего не обновляется. Вам нужен таймер или другой лучший способ сделать что-то. 'Thread.Sleep()' почти всегда неправильно. –

+0

Могу ли я предложить просто прочитать все из базы данных сразу и просто задержать отображение вашей информации? – Fang

+0

related: http://stackoverflow.com/questions/20849979/how-to-make-oledb-code-run-asynchronous –

ответ

1

пользовательский интерфейс управляет lab_word и lab_definition.Text будет обновлен после того, как весь com_start_Click метода завершается.
Вот почему вы видите, что показана только последняя строка.

Вам необходимо «освободить» поток пользовательского интерфейса после прочтения каждой строки в течение 3 секунд для обновления элементов управления пользовательского интерфейса новыми значениями.

Я думаю, async/await подходит подходит для этой цели.
Отметить кнопку click с ключевым словом async.

private async void com_start_Click(object sender, EventArgs e) 
{ 
    string ConString = 
     @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;"; 
    using (var Con = new OleDbConnection(ConString)) 
    { 
     Con.Open(); 
     check_connection.Text = "successed"; 
     using (var command = new OleDbCommand()) 
     { 
      command.Connection = Con; 
      command.CommandText = "Select * From words"; 
      using (var reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        lab_word.Text = reader["word"].ToString(); 
        lab_definition.Text = reader["definition"].ToString(); 
        await Task.Delay(30000); 
       } 
      } 
     } 
    } 
} 

Вы также можете использовать асинхронные методы OleDbConnection, OleDbCommand и OleDbReader

private async void com_start_Click(object sender, EventArgs e) 
{ 
    string ConString = 
     @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\MyBrainWash\Englishdb.accdb;"; 
    using (var Con = new OleDbConnection(ConString)) 
    { 
     await Con.OpenAsync(); 
     check_connection.Text = "successed"; 
     using (var command = new OleDbCommand()) 
     { 
      command.Connection = Con; 
      command.CommandText = "Select * From words"; 
      using (var reader = await command.ExecuteReader()) 
      { 
       while (await reader.ReadAsync()) 
       { 
        lab_word.Text = reader["word"].ToString(); 
        lab_definition.Text = reader["definition"].ToString(); 
        await Task.Delay(30000); 
       } 
      } 
     } 
    } 
} 
+0

спасибо за объяснение метода com_start_Click. Я пробовал ваше первое решение, но я не хочу нажимать каждый раз, когда я хочу перейти к следующей записи. Я хочу это автоматически. @ Fabio – user6497813

+0

Он работает автоматически - размер задержки меньше – Fabio

+0

Вы правы! Моя ошибка, я видел это как 3 тысячи :) @fabio – user6497813