显示在其他线程中加载数据期间加载动画

我有一个运行数据库的应用程序。 当我在datagridview中加载表时,我的表单冻结了。 如何在加载表格期间确保平滑加载动画?

我为动画运行两个线程并将数据加载到表中,但动画仍然不能始终有效。

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

当表单被冻结时,这意味着UI线程太忙,因此即使您尝试显示加载动画,它也不会设置动画。 您应该异步加载数据。

您可以使用async方法返回Task就像您在本文中可以看到的GetDataAsync方法一样。 然后在async事件处理程序中调用它。 在事件处理程序中,首先显示加载图像,然后异步加载数据,最后隐藏加载图像。

您可以简单地使用显示gif动画的普通PictureBox作为加载控件。 此外,您可能需要查看此post以显示trasparent加载图像。

在此处输入图像描述

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