Pregunta

Tengo que cargar algunos datos de una base de datos db4o que tiene 1 o 2 segundos en el arranque de mi aplicación, el resto tiene que esperar porque en primer lugar los datos tienen que ser cargados. haciendo esto en un hilo propia significaría que el resto tiene que esperar a que el hilo acabado. Me gustaría hacer una pantalla de bienvenida o algo durante los datos se cargan por lo que también es necesario un hilo propio, ¿verdad? ¿cómo lo haría?

Estoy usando CSharp, .net 3.5 y Windows Forms

¿Fue útil?

Solución

Mostrando una pantalla de bienvenida al iniciar es fácil de hacer. En el método de la aplicación principal () (en Program.cs), poner algo como esto antes de la línea Application.Run (...):

SplashForm splashy = new SplashForm();
splashy.Show();
Application.Run(new MainForm(splashy));

Modificar el código y constructor de su formulario principal, por lo que se ve algo como esto:

private SplashForm _splashy;
public MainForm(SplashForm splashy)
{
    _splashy = splashy;
    InitializeComponent();
}

Luego, al final del evento de carga de su MainForm (que presumiblemente contiene el código de base de datos), poner este código:

_splashy.Close();
_splashy.Dispose();

Si decide hacer su acceso a la base de datos con un hilo separado o BackgroundWorker, entonces usted realmente no necesita una pantalla de presentación tanto como sea necesario algún tipo de forma de indicador de progreso que aparece mientras que el BackgroundWorker está haciendo su cosa. Ello se haría de manera diferente de mi respuesta aquí.

Otros consejos

Una forma, probablemente mejores maneras sin embargo. Crear una nueva forma de diálogo que será su pantalla de la ventana / el chapoteo de progreso. Lanzar un mapa de bits o lo que sea en él como el único elemento. Una instancia del diálogo desde el programa principal. Anular el evento Load para el formulario de progreso y desde allí lanzar el nuevo hilo que va a hacer el trabajo de procesamiento en segundo plano para cargar los datos. De esta manera usted puede simplemente llamar ShowDialog de su aplicación principal.

si utiliza System.ComponentModel.BackgroundWorker entonces se puede conectar fácilmente hasta eventos para cuando el hilo se completa de forma automática y salir del diálogo de ese evento. El control vuelve de nuevo a la aplicación que llama y ya está.

He hecho este tipo de cosas en una aplicación antes y trabaja muy bien, pero estoy seguro de que es un enfoque novato. Aquí está el código de ejemplo desde el evento de carga en la forma que pone en marcha el hilo de fondo (en mi caso estoy abriendo y analizar archivos de gran tamaño):

 private void FileThreadStatusDialog_Load(object sender, EventArgs e)
 {
Cursor = Cursors.WaitCursor;

if (m_OpenMode)
{
    this.Text = "Opening...";
    StatusText.Text = m_FileName;
    FileThread = new BackgroundWorker();
    FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
    FileThread.DoWork += new DoWorkEventHandler(FileOpenThread_DoWork);
    FileThread.WorkerSupportsCancellation = false;
    FileThread.RunWorkerAsync();
}
else
{
    this.Text = "Saving...";
    StatusText.Text = m_FileName;
    FileThread = new BackgroundWorker();
    FileThread.RunWorkerCompleted += new RunWorkerCompletedEventHandler(FileThread_RunWorkerCompleted);
    FileThread.DoWork += new DoWorkEventHandler(FileSaveThread_DoWork);
    FileThread.WorkerSupportsCancellation = false;
    FileThread.RunWorkerAsync();
}

}

Y aquí está lo que el método de trabajo completado se parece a la que existe la forma:

private void FileThread_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    FileThread = null;
        DialogResult = DialogResult.OK;
        Close();
}

Así es como me abre el diálogo desde el diálogo principal progreso:

FileThreadStatusDialog thread = new FileThreadStatusDialog(m_Engine, dlg.FileName, true);
if (thread.ShowDialog(this) == DialogResult.OK)
{
        m_Engine = thread.Engine;
    FillTree();
}

Uno podría querer forzar dibujo de líquido en respuesta MusiGenesis' añadiendo

Application.DoEvents();

inmediatamente después

splashy.Show();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top