c# .net multithreading winforms datagridview

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



.net multithreading (1)

Cuando el formulario está congelado, significa que el hilo de la interfaz de usuario está demasiado ocupado, por lo que incluso si intenta mostrar una animación de carga, no se animará. Debe cargar los datos de forma asincrónica.

Puede tener un método async que devuelva la Task<DataTable> 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 muestre 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.

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

Tengo una aplicación que se ejecuta con la base de datos. Cuando cargo una tabla en la vista de cuadrícula de datos, mi formulario se congela. ¿Cómo asegurar la animación de carga suave durante la carga de tablas?

Ejecuto dos subprocesos para la animación y cargo datos en las tablas, pero la animación aú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; }