2009-11-04 6 views
7

Je montre un formulaire splash en démarrant un nouveau thread immédiatement avant d'exécuter mon formulaire principal.Méthode d'affichage de l'écran de démarrage meilleure pratique C#

Dans la méthode exécutée par ce thread, j'utilise Application.Run comme indiqué dans l'option 1 ci-dessous. Est-ce une façon correcte de le faire, ou y at-il des problèmes qui m'attendent parce que j'ai appelé Application.Run deux fois? Une alternative est l'option 2, également illustrée ci-dessous où j'appelle .ShowDialog() pour afficher le formulaire.

La forme splash elle-même se ferme après un certain temps, contrôlée dans le formulaire lui-même, et les deux options semblent bien fonctionner.

Donc ma question est: Quel est le préféré - Option 1 ou Option 2? Si vous pouviez donner des raisons précises pour l'un ou l'autre, ce serait formidable.

Merci.

Snippet de Main:

// Run splash screen thread. 
Thread splash = new Thread(new ThreadStart(ShowSplash)); 
splash.Start(); 

// Run main application. 
Application.Run(new MainForm()); 

option Afficher splash forme 1:

static void ShowSplash() 
    { 
     Application.Run(new SplashForm()); 
    } 

option Afficher splash forme 2:

static void ShowSplash() 
    { 
     using (SplashForm splash = new SplashForm()) 
     { 
      splash.ShowDialog(); 
     } 
    } 
+2

Télécharger le réflecteur et voir comment cela a été fait pour VB =). –

+0

Suis-je le seul qui déteste les écrans de démarrage? Il suffit de charger l'application de friture et d'arrêter de perdre mon temps. –

+0

@ Trickster: J'ai fait exactement cela et j'ai trouvé que finalement un appel à Application.Run est utilisé pour afficher le formulaire splash. Merci pour l'idée! J'ai marqué votre réponse comme acceptée. – Andy

Répondre

3

Option 2 aura probablement des ennuis parce qu'alors vous utilisez le même Mesageloop que le MainForm mais à partir d'un autre thread.

L'option 1 est correcte.

+0

@Henk: En fait, je pense que c'est peut-être incorrect. Je crois qu'appeler Application.Run à partir d'un nouveau thread lancera un nouveau thread d'interface utilisateur, distinct du thread principal. Jetez un oeil ici: http://stackoverflow.com/questions/745057/how-to-start-a-ui-thread-in-c Andy

+0

Repost du lien :) http://stackoverflow.com/ questions/745057/comment-démarrer-un-ui-thread-en-c – Andy

+0

Andy, Option 2 n'utilise pas (un extra) App.Run() –

1

Je me rends compte que cela peut être un point de vue inhabituel, mais avez-vous pensé ne pas utiliser un écran de démarrage et à la place montrant les informations sur la « page d'accueil » ou « aide> à propos de 'écran à la place?

Il y a quelques raisons de le faire:

  1. À moins que vous entrez dans le multi-threading, un écran d'accueil ne peut pas repeindre correctement si une alerte/MsgBox apparaît sur le dessus de celui-ci, annihilant l'avantage de l'écran de démarrage entièrement. Les écrans de démarrage qui affichent 'vous avez installé les modules x, y et z' ne peuvent pas vraiment le dire tant que ces informations n'ont pas été chargées. Au moment où cette information est chargée, votre application est prête à être utilisée. Vous fermez donc l'écran de démarrage ou l'utilisateur se trouve dans l'impossibilité de le faire.

  2. Si je détourne le regard et rate l'écran d'accueil, les informations que vous me fournirez me manqueront. Si «Licence expire dans 3 jours» fait partie de cette information, et aujourd'hui c'est vendredi, cela signifie que je ne me rendrai pas compte que lundi, je ne peux pas utiliser l'application. Obscur, mais je l'ai vu.

+0

"' A moins que vous n'ayez plusieurs threads "- Est-ce * difficile * d'instancier un nouveau thread()'? –

+0

Sur une note plus constructive - l'écran de démarrage de Photoshop donne l'impression qu'il charge presque instantanément, même si ce n'est pas le cas, IMO. –

Questions connexes