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?


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

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

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

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;

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

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

Itu cara yang sempurna. Terima kasih! :)
Deniz


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

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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.