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?


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);

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();
}

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

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;
....

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;

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);
}

Das ist einfach der perfekte Weg. Vielen Dank ! :)
Deniz


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

-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;
    }
}

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.