Mostrar la animación de carga durante la carga de datos en otro hilo

Tengo una aplicación ejecutándose con la base de datos. Cuando cargo una tabla en la vista de tabla de datos, mi formulario se congela. ¿Cómo asegurar la animación de carga suave durante la carga de tablas?

Ejecutar dos hilos para la animación y cargar datos en las tablas, pero la animación no siempre funciona.

private volatile bool threadRun; private void UpdateTab() { // Create panel for animation Panel loadingPanel = new Panel(); // Label, where the text will change Label loadingLabel = new Label(); loadingLabel.Text = "Loading"; loadingPanel.Controls.Add(loadingLabel); this.Controls.Add(loadingPanel); // thread loading animation threadRun = true; Task.Factory.StartNew(() => { int i = 0; string labelText; while (threadRun) { Thread.Sleep(500); switch (i) { case 0: labelText = "Loading."; i = 1; break; case 1: labelText = "Loading.."; i = 2; break; default: labelText = "Loading..."; i = 0; break; } loadingLabel.BeginInvoke(new Action(() => loadingLabel.Text = labelText)); } }); // thread update DataGridView Thread update = new Thread(ThreadUpdateTab); update.Start(); } private void ThreadUpdateTab() { // SQL Query... myDataGridView1.Invoke(new Action(() => myDataGridView1.DataSource = myDataSet1.Tables[0])); // ... myDataGridView10.Invoke(new Action(() => myDataGridView10.DataSource = myDataSet10.Tables[0])); threadRun = false; } 

Cuando el formulario está congelado, significa que el subproceso de interfaz de usuario está demasiado ocupado y, por lo tanto, aunque intente mostrar una animación de carga, no se animará. Debe cargar datos de forma asincrónica.

Puede tener un método async que devuelva la Task como el método GetDataAsync que puede ver en esta publicación . Luego llámalo en un controlador de eventos async . En el controlador de eventos, primero muestre la imagen de carga, luego cargue los datos de forma asincrónica y, por último, oculte la imagen de carga.

Simplemente puede usar un PictureBox normal que muestra una animación gif como control de carga. También es posible que desee echar un vistazo a esta publicación para mostrar una imagen de carga transparente.

enter image description here

 public async Task GetDataAsync() { var dt = new DataTable(); var cn = @"Your Connection String"; var cmd = @"SELECT * FROM Category"; var da = new SqlDataAdapter(cmd, cn); await Task.Run(() => { da.Fill(dt); }); return dt; } private async void LoadDataButton_Click(object sender, EventArgs e) { loadingPictureBox.Show(); loadingPictureBox.Update(); try { var data = await GetDataAsync(); dataGridView1.DataSource = data; } catch (Exception ex) { //Handle Exception } loadingPictureBox.hide(); }