Приложение WPF C # Заняло слишком много времени, чтобы получить данные из SQL Server - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть приложение WPF, подключенное к SQL Server; хотя я загружаю до 10 записей в свою DataGrid, мое приложение работает нормально, и ответ слишком быстрый, но когда я загружаю все строки (а это почти 1000), моему приложению требуется около 15 секунд для загрузки и замораживания всего пользовательского интерфейса.

Но когда я выполняю тот же запрос в SQL Server, загрузка этих 1000 строк занимает всего около 00: 00: 00.490 секунд, что слишком быстро. Что я уже сделал, как показано ниже, чтобы избежать зависания пользовательского интерфейса и быстрого выполнения запросов. Что я делаю не так? Пожалуйста, ознакомьтесь с фрагментами кода, поскольку я новичок в мире C #.

 //CALLING FUNCTION TO LOAD DATA INTO DATAGRID IN A NEW THREAD TO MAKE UI RESPONSIVE
String qry = "select * from institutes_tbl"
DataGrid dg = MainDataGrid;

Thread thread = new Thread(() => FunDataGrid_DataView(dg, qry));
thread.IsBackground = true;
thread.Start(); 

но, к сожалению, мой пользовательский интерфейс показывает сообщение "Не отвечает". Ниже приведено определение функции:

public void FunDataGrid_DataView(DataGrid dg, string qry)
{
    Application.Current.Dispatcher.BeginInvoke(
                  DispatcherPriority.Background,
                  new Action(() =>
                  {                       
                      try
                      {
                          con = new SqlConnection(con_string);
                          cmd = new SqlCommand(qry, con);
                          cmd.CommandTimeout = 12 * 3600;
                          SqlDataAdapter da = new SqlDataAdapter(cmd);
                          DataTable dt = new DataTable();
                          da.Fill(dt);
                          dg.ItemsSource = dt.DefaultView;
                      }
                      catch (Exception ex)
                      {
                          MessageBox.Show(ex.Message, "Error!", MessageBoxButton.OK, MessageBoxImage.Warning);
                      }                                                                      
                  }));                            
    }

вот мой XAML

 <DataGrid x:Name="DataGrid_View" MouseLeftButtonUp="DataGrid_View_MouseLeftButtonUp" ItemsSource="{Binding DATA_TBL}" LoadingRow="DataGrid_View_LoadingRow" Grid.Row="2" Grid.Column="0" ScrollViewer.CanContentScroll="False" AutoGenerateColumns="False" CanUserAddRows="False" Background="#7F179DB2" CellStyle="{StaticResource CellStyle}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Header="Name" Binding="{Binding NAME}" Width="5*"/>
                        <DataGridTextColumn Header="Father Name" Binding="{Binding F_NAME}" Width="5*"/>
                        <DataGridTextColumn Header="CNIC" Binding="{Binding CNIC}" Width="5*"/>
            </DataGrid.Columns>
            </DataGrid>

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

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Запустить новый фоновый поток для запроса данных из таблицы, как показано ниже

        Task.Factory.StartNew(() =>
        {
            try
            {
                con = new SqlConnection(con_string);
                cmd = new SqlCommand(qry, con);
                cmd.CommandTimeout = 12 * 3600;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);
                Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Background,
                  new Action(() => dg.ItemsSource = dt.DefaultView));
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error!", MessageBoxButton.OK, MessageBoxImage.Warning);
            }
        });
0 голосов
/ 18 ноября 2018

Попробуйте:

public void FunDataGrid_DataView(DataGrid dg, string qry)
{
    con = new SqlConnection(con_string);
    cmd = new SqlCommand(qry, con);
    cmd.CommandTimeout = 12 * 3600;
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    DataTable dt = new DataTable();
    da.Fill(dt);

    Application.Current.Dispatcher.BeginInvoke(
              DispatcherPriority.Background,
              new Action(() =>
              {                       
                  try
                  {
                      dg.ItemsSource = dt.DefaultView;
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.Message, "Error!", MessageBoxButton.OK, MessageBoxImage.Warning);
                  }                                                                      
              }));                            
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...