Domanda

Ho avuto modo di caricare alcuni dati da un database db4o che prende 1 o 2 secondi all'avvio del mio app, il resto deve aspettare perché prima di tutto i dati deve essere caricato. facendo questo in una discussione proprio significherebbe che il resto deve attendere per il thread-finitura. Mi piacerebbe fare una schermata iniziale o qualcosa durante il caricamento dei dati per quello che anche bisogno di un proprio thread, giusto? come si dovrebbe fare?

sto usando csharp, .NET 3.5 e WinForms

È stato utile?

Soluzione

Mostra una schermata iniziale in fase di avvio è facile da fare. Nel metodo dell'applicazione principale () (in Program.cs), mettere qualcosa di simile prima linea Application.Run (...):

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

Modificare il codice e costruttore per il modulo principale in modo che sembra qualcosa di simile:

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

Poi, alla fine di evento Load del vostro MainForm (che contiene presumibilmente il codice del database), inserire questo codice:

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

Se si sceglie di fare il vostro accesso al database con un thread separato o BackgroundWorker, allora non ha realmente bisogno di una schermata iniziale così tanto come avete bisogno di un qualche tipo di forma di indicatore di progresso che appare mentre il BackgroundWorker sta facendo il suo dovere. Che sarebbe stato fatto in maniera diversa dalla mia risposta qui.

Altri suggerimenti

Un modo, probabilmente modi migliori però. Creare un nuovo modulo finestra di dialogo che sarà la vostra finestra dello schermo / splash progresso. Gettare un bitmap o qualsiasi altra cosa su di essa come l'unico elemento. Un'istanza della finestra di dialogo dal programma principale. Sovrascrivere l'evento Load per la maschera il progresso e da lì lanciare il nuovo thread che farà il lavoro di elaborazione in background per caricare il backup dei dati. In questo modo si può chiamare ShowDialog dalla tua app principale.

se si utilizza System.ComponentModel.BackgroundWorker allora si può facilmente collegare gli eventi per quando il thread completa e automaticamente uscire dalla finestra da quell'evento. Il controllo viene restituito indietro alla applicazione chiamante e il gioco è fatto.

Ho fatto questo genere di cose in un'applicazione prima e funziona benissimo, ma sono sicuro che è un approccio alle prime armi. Ecco il codice di esempio dall'evento Load nella forma che lancia il thread in background (nel mio caso sto aprendo e l'analisi di file di grandi dimensioni):

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

}

Ed ecco quello che il metodo di lavoro a termine sembra che esistono sotto forma:

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

Ecco come apro la finestra dalla finestra principale di avanzamento:

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

Si potrebbe voler forzare il disegno di splashy in risposta MusiGenesis' con l'aggiunta di

Application.DoEvents();

immediatamente dopo

splashy.Show();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top