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ì?
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ì?
Câu trả lời:
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);
Cá nhân tôi nghĩ Thread.Sleep
là 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();
}
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ờ đợ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;
....
.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.Delay
sẽ đá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);
}
sử dụng dataGridView1.Refresh();
:)
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
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;
}
}