我有一个与数据库一起运行的应用程序。当我在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;
}
1条答案
按热度按时间mefy6pfw1#
当窗体被冻结时,这意味着UI线程忙碌,因此即使您尝试显示加载动画,它也不会显示。您应该异步加载数据。
您可以有一个
async
方法,它返回Task<DataTable>
,就像您在this post中看到的GetDataAsync
方法一样。然后在async
事件处理程序中调用它。在事件处理程序中,首先显示加载图像,然后异步加载数据,最后隐藏加载图像。你可以简单地使用一个普通的
PictureBox
来显示一个gif动画作为加载控件。你也可以看看this post来显示一个透明的加载图像。