dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Ich möchte eine Sekunde warten, bevor ich meine Gitterzellen mit diesem Code drucke, aber es funktioniert nicht. Was kann ich tun?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Ich möchte eine Sekunde warten, bevor ich meine Gitterzellen mit diesem Code drucke, aber es funktioniert nicht. Was kann ich tun?
Antworten:
Hält es an, aber Sie sehen Ihre rote Farbe nicht in der Zelle? Versuche dies:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
Persönlich halte ich Thread.Sleep
eine schlechte Umsetzung. Es sperrt die Benutzeroberfläche usw. Ich persönlich mag Timer-Implementierungen, da es wartet und dann ausgelöst wird.
Verwendung: DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));
//Note Forms.Timer and Timer() have similar implementations.
public static void DelayAction(int millisecond, Action action)
{
var timer = new DispatcherTimer();
timer.Tick += delegate
{
action.Invoke();
timer.Stop();
};
timer.Interval = TimeSpan.FromMilliseconds(millisecond);
timer.Start();
}
Wartefunktion mit Timern, keine UI-Sperren.
public void wait(int milliseconds)
{
var timer1 = new System.Windows.Forms.Timer();
if (milliseconds == 0 || milliseconds < 0) return;
// Console.WriteLine("start wait timer");
timer1.Interval = milliseconds;
timer1.Enabled = true;
timer1.Start();
timer1.Tick += (s, e) =>
{
timer1.Enabled = false;
timer1.Stop();
// Console.WriteLine("stop wait timer");
};
while (timer1.Enabled)
{
Application.DoEvents();
}
}
Verwendung: Platzieren Sie dies einfach in Ihrem Code, der warten muss:
wait(1000); //wait one second
Beschäftigtes Warten ist kein schwerwiegender Nachteil, wenn es kurz ist. In meinem Fall musste dem Benutzer durch Flashen eines Steuerelements ein visuelles Feedback gegeben werden (es handelt sich um ein Diagrammsteuerelement, das in die Zwischenablage kopiert werden kann und dessen Hintergrund für einige Millisekunden geändert wird). Es funktioniert gut so:
using System.Threading;
...
Clipboard.SetImage(bm); // some code
distribution_chart.BackColor = Color.Gray;
Application.DoEvents(); // ensure repaint, may be not needed
Thread.Sleep(50);
distribution_chart.BackColor = Color.OldLace;
....
Ich habe das Gefühl, dass hier nur die Reihenfolge falsch war. Selçuklu wollte, dass die App eine Sekunde wartet, bevor sie das Raster ausfüllt. Der Befehl Sleep sollte also vor dem Befehl fill stehen.
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
.Net Core scheint das zu fehlen DispatcherTimer
.
Wenn wir mit der Verwendung einer asynchronen Methode einverstanden sind, Task.Delay
werden unsere Anforderungen erfüllt. Dies kann auch nützlich sein, wenn Sie aus ratenbegrenzenden Gründen innerhalb einer for-Schleife warten möchten.
public async Task DoTasks(List<Items> items)
{
foreach (var item in items)
{
await Task.Delay(2 * 1000);
DoWork(item);
}
}
Sie können den Abschluss dieser Methode wie folgt abwarten:
public async void TaskCaller(List<Item> items)
{
await DoTasks(items);
}
benutze dataGridView1.Refresh();
:)
Probieren Sie diese Funktion aus
public void Wait(int time)
{
Thread thread = new Thread(delegate()
{
System.Threading.Thread.Sleep(time);
});
thread.Start();
while (thread.IsAlive)
Application.DoEvents();
}
Funktion aufrufen
Wait(1000); // Wait for 1000ms = 1s
Vielleicht versuchen Sie diesen Code:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}