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