Chờ một giây trong chương trình đang chạy


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

Tôi muốn đợi một giây trước khi in các ô lưới của tôi với mã này, nhưng nó không hoạt động. Tôi có thể làm gì?


1
Đoạn mã nào sẽ được chạy sau 1 giây chờ đợi?
Allensb

1
Làm sao bạn biết nó không hoạt động? Hãy thử ngủ 10000 và xem nó có hoạt động không. 1000 là rất ngắn để đánh giá xem nó có hoạt động hay không.
Missy

Điều này hoạt động tốt: System.Threading.Thread.Sleep (1000);
Andrew

Câu trả lời:


177

Nó đang tạm dừng, nhưng bạn không thấy màu đỏ của bạn xuất hiện trong ô? Thử cái này:

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

28

Cá nhân tôi nghĩ Thread.Sleeplà một triển khai kém. Nó khóa giao diện người dùng, v.v. Cá nhân tôi thích triển khai bộ đếm thời gian vì nó đợi rồi kích hoạt.

Sử dụng: 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

Chức năng chờ sử dụng bộ hẹn giờ, không có khóa giao diện người dùng.

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

Cách sử dụng: chỉ cần đặt cái này bên trong mã của bạn cần đợi:

wait(1000); //wait one second

Chỉ là một gợi ý. Nếu bạn nhân min với 60000, tên tham số sẽ có ý nghĩa hơn. timer1.Interval = min * 60000;
Golda

Đúng, bạn nói đúng, nó phải là mili giây thay vì min. Tôi sẽ cập nhật tên. Cảm ơn
nói

2

Chờ đợi bận rộn sẽ không phải là một hạn chế nghiêm trọng nếu nó ngắn. Trong trường hợp của tôi, cần phải cung cấp phản hồi trực quan cho người dùng bằng cách nhấp nháy một điều khiển (đó là điều khiển biểu đồ có thể được sao chép vào khay nhớ tạm, điều này sẽ thay đổi nền của nó trong vài mili giây). Nó hoạt động tốt theo cách này:

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

Tôi cảm thấy như tất cả những gì sai ở đây là lệnh, Selçuklu muốn ứng dụng đợi một giây trước khi điền vào lưới, vì vậy lệnh Sleep nên xuất hiện trước lệnh điền.

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

2

.Net Core dường như thiếu DispatcherTimer.

Nếu chúng tôi đồng ý với việc sử dụng phương pháp không đồng bộ, Task.Delaysẽ đáp ứng nhu cầu của chúng tôi. Điều này cũng có thể hữu ích nếu bạn muốn đợi bên trong vòng lặp for vì lý do giới hạn tốc độ.

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

Bạn có thể chờ hoàn thành phương pháp này như sau:

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}

Đó chỉ là cách hoàn hảo. Cảm ơn ! :)
Deniz


0

Hãy thử chức năng này

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

Chức năng gọi

Wait(1000); // Wait for 1000ms = 1s

-4

Có thể thử mã này:

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

    while (t < tf) {
        t = DateTime.Now;
    }
}

5
Đây là một giải pháp hợp lệ. Tuy nhiên, bạn nên bổ sung thêm mô tả lợi và hại của nó, chẳng hạn như đề cập rằng vì là giải pháp chờ đợi bận rộn nên sẽ chiếm thời gian của CPU.

1
Các giải pháp ngắn là giải pháp tốt hơn
BASEER ULHASSAN
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.