Warten Sie eine Sekunde im laufenden Programm

103
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?

Selçuklu Ebrar
quelle
1
Welcher Code soll nach 1 Sekunde Wartezeit ausgeführt werden?
Allensb
1
Woher weißt du, dass es nicht funktioniert? Versuchen Sie, 10000 zu schlafen und prüfen Sie, ob es funktioniert. 1000 ist sehr kurz, um zu beurteilen, ob es funktioniert.
Missy
Dies funktioniert gut: System.Threading.Thread.Sleep (1000);
Andrew

Antworten:

175

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);
Matt Dawdy
quelle
28

Persönlich halte ich Thread.Sleepeine 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();
}
Mark Rowe
quelle
15

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
Sagte
quelle
Nur ein Vorschlag. Wenn Sie die min mit 60000 multiplizieren, ist der Parametername aussagekräftiger. timer1.Interval = min * 60000;
Golda
Ja, Sie haben Recht, es sollte Millisekunden statt min sein. Ich werde den Namen aktualisieren. Danke
sagte
2

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;
....
ChrisW
quelle
2

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;
Colin D.
quelle
2

.Net Core scheint das zu fehlen DispatcherTimer.

Wenn wir mit der Verwendung einer asynchronen Methode einverstanden sind, Task.Delaywerden 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);
}
Rich Hildebrand
quelle
Das ist einfach der perfekte Weg. Vielen Dank ! :)
Deniz
1

benutze dataGridView1.Refresh();:)

Codierer SAJDFJF
quelle
0

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
Savaş SERTER
quelle
-4

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;
    }
}
Bartek Winslawski
quelle
5
Dies ist eine gültige Lösung. Sie sollten jedoch eine Beschreibung der Vor- und Nachteile hinzufügen, z. B. die Erwähnung, dass die CPU-Zeit in Anspruch genommen wird, da es sich um eine Lösung handelt, bei der viel gewartet wird.
1
Die kürzere Lösung ist die bessere Lösung
BASEER ULHASSAN