Mon application C# s'exécute au démarrage du système et doit attendre l'instance SQL Server locale pour pouvoir faire quoi que ce soit. En ce moment, je file juste en attente de réponse du serveur (j'avais l'habitude d'avoir une poignée d'attente sur le service, mais ce n'était pas fiable), puis j'ai lancé la boîte de dialogue principale de l'application. Le problème avec ceci, bien sûr, est que l'utilisateur ne peut rien dire jusqu'à ce que le service commence, et en raison du matériel que nous utilisons, cela peut prendre jusqu'à une minute. Je pense donc à lancer un indicateur "Chargement/Veuillez patienter". Le fait est que notre projet est proche du verrouillage et qu'un changement aussi important qu'une nouvelle classe causerait beaucoup de maux de tête - modifier un fichier existant (comme Program.cs) est beaucoup moins intrusif que d'en créer un nouveau. Longue histoire courte: existe-t-il une classe .NET qui serait bien adaptée pour être affichée (de manière asynchrone, je suppose) avant de commencer à plier sur le serveur SQL, puis retirée quand elle commence à répondre?Y a-t-il une boîte de dialogue "stock" inactif/en attente?
Répondre
Voici une version à trois fils que j'ai piraté rapidement pour faire l'affaire. Cela peut être déposé n'importe où sous une forme visible (ou pourrait être modifié pour program.cs) et engendrera une nouvelle boîte de dialogue modale centrée avec une barre de progression lisse qui dominera l'attention de l'utilisateur jusqu'à ce que FinishedProcessing dans le thread parent soit défini à vrai.
//Update to true when finished loading or processing
bool FinishedProcessing = false;
System.Threading.AutoResetEvent DialogLoadedFlag
= new System.Threading.AutoResetEvent(false);
(new System.Threading.Thread(()=> {
Form StockWaitForm = new Form()
{ Name = "StockWaitForm", Text = "Please Wait...", ControlBox = false,
FormBorderStyle = FormBorderStyle.FixedDialog, StartPosition = FormStartPosition.CenterParent,
Width = 240, Height = 80, Enabled = true };
ProgressBar ScrollingBar = new ProgressBar()
{ Style = ProgressBarStyle.Marquee, Parent = StockWaitForm,
Dock = DockStyle.Fill, Enabled = true };
StockWaitForm.Load += new EventHandler((x, y) =>
{
DialogLoadedFlag.Set();
(new System.Threading.Thread(()=> {
while (FinishedProcessing == false) Application.DoEvents();
StockWaitForm.Invoke((MethodInvoker)(()=> StockWaitForm.Close()));
})).Start();
});
this.Invoke((MethodInvoker)(()=>StockWaitForm.ShowDialog(this)));
})).Start();
while (DialogLoadedFlag.WaitOne(100,true) == false) Application.DoEvents();
//
//Example Usage
//Faux Work - Have your local SQL server instance load here
for (int x = 0; x < 1000000; x++) int y = x + 2;
FinishedProcessing = true;
Personnalisez au goût. En outre, si vous l'utilisez dans une application de production, enveloppez le nouveau contenu du thread dans try ... catch blocks to CYA. Une dernière chose, je publie ce code pour vous sous la "Coderer Public License/SO V1.1", comme suit:
Coderer Public License/SO v1.0
I, personne connue "Coderer" sur la communauté "Stack Overflow", accepte d'envisager sérieusement de passer à une méthodologie de gestion de projet sain qui permet d'ajouter des classes supplémentaires aux projets dans la phase d'exécution. Je comprends que le contrôle des changements de type nazi est malsain pour toutes les parties impliquées.
est ici un wrapper .NET autour de la boîte de dialogue standard de progression Windows:
http://www.codeproject.com/KB/shell/iprogressdialognet.aspx
Je n'ai pas sali avec, mais je suis sûr qu'il ya un drapeau pour faire tourner la barre de progression. Si vous voulez avoir vraiment envie, vous pouvez même monter votre propre animation AVI et la brancher.
Cela semble très bien, sauf que ce serait l'ajout d'un nouveau fichier, ce que j'essayais d'éviter en premier lieu. La raison pour laquelle j'ai dit "stock" est que je voudrais quelque chose que vous pouvez obtenir en installant un disque de vente au détail VS 2005 sur une machine Win XP au détail. – Coderer
Eh bien dans ce cas, il n'y a vraiment rien que vous puissiez faire. Il n'y a pas de dialogue de stock, donc l'ajout d'un nouveau fichier est inévitable pour ce genre de chose. –
Aussi simple qu'une boîte de dialogue "Please wait ..." est de construire, je ne vois pas pourquoi.
À ma connaissance, non. Il n'y a pas de stock. Il est presque plus facile de faire pousser le vôtre ... ou simplement de désactiver le formulaire et d'afficher le curseur de sablier. Même idée, et aussi facile à mettre en œuvre.
Encore une fois, j'essaie juste d'éviter de créer un nouveau fichier de classe pour des raisons de gestion de projet. Si je peux ajouter une ou deux lignes de code, je le ferai. Si je dois ajouter 50 lignes de code dans un nouveau fichier, je ne le ferai pas. – Coderer
Si 50 lignes de code vont ruiner votre système de gestion de projet, c'est probablement un signe que vous avez besoin d'un nouveau. –
Vous pourriez envisager de faire votre travail SQL dans BackgroundWorker (dans un thread de travail). Cela laisserait votre application sensible.
Le problème est que notre boîte de dialogue initiale utilise des liens de données SQL, et il n'y a pas de moyen facile de dire «éteignez-les jusqu'à ce que l'indicateur 'Server Responding' soit défini par cet autre thread». Au moins, je ne * pense * pas qu'il y a. – Coderer
Chose drôle, je l'ai fait presque exactement la nuit dernière par moi-même. Je ne pense pas que vous ayez besoin de 3 threads - j'en ai seulement utilisé deux. En ce qui concerne la gestion de projet, le fait est que nous n'avons pas de phase d'exécution, nous avons une phase de contrôle à tout jamais. Et nous sommes * presque * là. – Coderer
J'ai vraiment essayé votre code dans une application Winforms. mais malheureusement, la boîte de dialogue "Veuillez patienter ..." ne disparaît jamais. Qu'est-ce que je fais mal? – Kai
J'ai eu le même problème que Kai. Il s'est avéré que l'appel de cette boîte de dialogue à partir de mon thread UI principal bloqué sur 'Application.DoEvents()'. Je définissais 'FinishedProcessing' dans mon thread d'interface utilisateur principal et donc la boîte de dialogue ne s'est jamais fermée. Pour contourner ce problème, j'ai dû créer un fil séparé pour faire le travail. Voir le [détail ici] (https://gist.github.com/3702171). – Onisemus