Personnellement, je pense que Thread.Sleepc'est une mauvaise mise en œuvre. Il verrouille l'interface utilisateur, etc. J'aime personnellement les implémentations de minuterie car il attend puis se déclenche.
Usage: DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));
//Note Forms.Timer and Timer() have similar implementations. publicstaticvoidDelayAction(int millisecond,Action action){var timer =newDispatcherTimer();
timer.Tick+=delegate{
action.Invoke();
timer.Stop();};
timer.Interval=TimeSpan.FromMilliseconds(millisecond);
timer.Start();}
Juste une suggestion. Si vous multipliez le min par 60000, le nom du paramètre sera plus significatif. timer1.Interval = min * 60000;
Golda
Oui, vous avez raison, cela devrait être des millisecondes au lieu de min. Je mettrai à jour le nom. Merci
Dit
2
L'attente occupée ne sera pas un inconvénient majeur si elle est courte. Dans mon cas, il était nécessaire de donner un retour visuel à l'utilisateur en faisant clignoter un contrôle (c'est un contrôle de graphique qui peut être copié dans le presse-papiers, qui change d'arrière-plan pendant quelques millisecondes). Cela fonctionne bien de cette façon:
using System.Threading;...Clipboard.SetImage(bm);// some code
distribution_chart.BackColor=Color.Gray;Application.DoEvents();// ensure repaint, may be not neededThread.Sleep(50);
distribution_chart.BackColor=Color.OldLace;....
J'ai l'impression que tout ce qui n'allait pas ici était l'ordre, Selçuklu voulait que l'application attende une seconde avant de remplir la grille, donc la commande Sleep aurait dû venir avant la commande fill.
Si nous acceptons d'utiliser une méthode asynchrone, Task.Delayrépondra à nos besoins. Cela peut également être utile si vous souhaitez attendre à l'intérieur d'une boucle for pour des raisons de limitation de débit.
publicasyncTaskDoTasks(List<Items> items){foreach(var item in items){awaitTask.Delay(2*1000);DoWork(item);}}
Vous pouvez attendre la fin de cette méthode comme suit:
La meilleure façon d'attendre sans geler votre thread principal consiste à utiliser la tâche. fonction .
Donc votre code ressemblera à ceci
var t =Task.Run(asyncdelegate{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor=System.Drawing.Color.Red;
dataGridView1.Refresh();awaitTask.Delay(1000);});
C'est une solution valable. Cependant, vous devez ajouter une description de ses avantages et inconvénients, par exemple en mentionnant que, comme il s'agit d'une solution d'attente très chargée, elle prendra du temps CPU.
1
La solution la plus courte est la meilleure solution
Réponses:
Est-ce qu'il fait une pause, mais vous ne voyez pas votre couleur rouge apparaître dans la cellule? Essaye ça:
la source
Personnellement, je pense que
Thread.Sleep
c'est une mauvaise mise en œuvre. Il verrouille l'interface utilisateur, etc. J'aime personnellement les implémentations de minuterie car il attend puis se déclenche.Usage:
DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));
la source
Fonction d'attente à l'aide de minuteries, pas de verrous d'interface utilisateur.
Utilisation: il suffit de placer ceci dans votre code qui doit attendre:
la source
L'attente occupée ne sera pas un inconvénient majeur si elle est courte. Dans mon cas, il était nécessaire de donner un retour visuel à l'utilisateur en faisant clignoter un contrôle (c'est un contrôle de graphique qui peut être copié dans le presse-papiers, qui change d'arrière-plan pendant quelques millisecondes). Cela fonctionne bien de cette façon:
la source
J'ai l'impression que tout ce qui n'allait pas ici était l'ordre, Selçuklu voulait que l'application attende une seconde avant de remplir la grille, donc la commande Sleep aurait dû venir avant la commande fill.
la source
.Net Core semble manquer le
DispatcherTimer
.Si nous acceptons d'utiliser une méthode asynchrone,
Task.Delay
répondra à nos besoins. Cela peut également être utile si vous souhaitez attendre à l'intérieur d'une boucle for pour des raisons de limitation de débit.Vous pouvez attendre la fin de cette méthode comme suit:
la source
utiliser
dataGridView1.Refresh();
:)la source
Essayez cette fonction
Fonction d'appel
la source
La meilleure façon d'attendre sans geler votre thread principal consiste à utiliser la tâche. fonction .
Donc votre code ressemblera à ceci
la source
Essayez peut-être ce code:
la source