Mostra l’animazione del caricamento durante il caricamento dei dati in altro thread

Ho un’applicazione in esecuzione con il database. Quando carico una tabella in datagridview, il mio modulo si blocca. Come garantire l’animazione del carico regolare durante le tabelle di caricamento?

Eseguo due thread per l’animazione e carico i dati nelle tabelle, ma l’animazione continua a non funzionare sempre.

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; } 

Quando il modulo è bloccato, significa che il thread dell’interfaccia utente è troppo occupato e quindi, anche se provi a mostrare un’animazione di caricamento, non si animerà. È necessario caricare i dati in modo asincrono.

Puoi avere un metodo async che restituisce l’ Task come il metodo GetDataAsync che puoi vedere in questo post . Quindi chiamalo in un gestore di eventi async . Nel gestore eventi, prima mostra l’immagine di caricamento, quindi carica i dati in modo asincrono e alla fine nascondi l’immagine di caricamento.

Puoi semplicemente usare un PictureBox normale che mostra un’animazione gif come controllo del caricamento. Potresti anche dare un’occhiata a questo post per mostrare un’immagine di caricamento trasparente.

inserisci la descrizione dell'immagine qui

 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(); }