Tunggu satu detik dalam menjalankan program

106
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

Saya ingin menunggu satu detik sebelum mencetak sel kisi saya dengan kode ini, tetapi tidak berhasil. Apa yang dapat saya?

Selçuklu Ebrar
sumber
1
Kode apa yang seharusnya dijalankan setelah penantian 1 detik?
Allensb
1
Bagaimana Anda tahu itu tidak berfungsi? Coba tidur 10000 dan lihat apakah itu berfungsi. 1000 sangat singkat untuk dievaluasi jika berhasil.
Missy
Ini berfungsi dengan baik: System.Threading.Thread.Sleep (1000);
Andrew

Jawaban:

178

Apakah itu berhenti, tetapi Anda tidak melihat warna merah Anda muncul di sel? Coba ini:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
Matt Dawdy
sumber
28

Secara pribadi saya pikir Thread.Sleepini adalah implementasi yang buruk. Itu mengunci UI dll. Saya pribadi suka implementasi timer karena menunggu kemudian menyala.

Pemakaian: 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
sumber
16

Tunggu fungsi menggunakan timer, tidak ada kunci UI.

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

Penggunaan: cukup letakkan ini di dalam kode Anda yang perlu menunggu:

wait(1000); //wait one second
Kata
sumber
Hanya sebuah saran. Jika Anda mengalikan min dengan 60000, nama parameter akan lebih bermakna. timer1.Interval = min * 60000;
Golda
Ya, Anda benar, seharusnya milidetik, bukan min. Saya akan memperbarui nama. Terima kasih
Mengatakan
3

Saya merasa semua yang salah di sini adalah urutannya, Selçuklu ingin aplikasi menunggu sebentar sebelum mengisi kisi, jadi perintah Tidur seharusnya ada sebelum perintah isi.

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
Colin D
sumber
2

Penantian yang sibuk tidak akan menjadi kerugian yang parah jika itu singkat. Dalam kasus saya, ada kebutuhan untuk memberikan umpan balik visual kepada pengguna dengan mem-flash kontrol (ini adalah kontrol bagan yang dapat disalin ke clipboard, yang mengubah latar belakangnya selama beberapa milidetik). Ini berfungsi dengan baik seperti ini:

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
sumber
2

.Net Core tampaknya kehilangan file DispatcherTimer.

Jika kita OK dengan menggunakan metode async, Task.Delayakan memenuhi kebutuhan kita. Ini juga dapat berguna jika Anda ingin menunggu di dalam loop for untuk alasan pembatasan kecepatan.

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

Anda bisa menunggu selesainya metode ini sebagai berikut:

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}
Rich Hildebrand
sumber
Itu cara yang sempurna. Terima kasih! :)
Deniz
1

gunakan dataGridView1.Refresh();:)

Coder SAJDFJF
sumber
0

Coba fungsi ini

public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}

Fungsi panggilan

Wait(1000); // Wait for 1000ms = 1s
Savaş SERTER
sumber
0

Cara terbaik untuk menunggu tanpa membekukan utas utama Anda adalah menggunakan fungsi Task.Delay .

Jadi kode Anda akan terlihat seperti ini

var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});
amitklein
sumber
-4

Mungkin coba kode ini:

void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);

    while (t < tf) {
        t = DateTime.Now;
    }
}
Bartek Winslawski
sumber
5
Ini adalah solusi yang valid. Namun, Anda harus menambahkan deskripsi manfaat dan kerugiannya, seperti menyebutkan bahwa karena ini adalah solusi yang menunggu dengan sibuk, maka akan memakan waktu CPU.
1
Solusi yang lebih singkat adalah solusi yang lebih baik
BASEER ULHASSAN