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?
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?
Jawaban:
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);
Secara pribadi saya pikir Thread.Sleep
ini 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();
}
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
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;
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;
....
.Net Core tampaknya kehilangan file DispatcherTimer
.
Jika kita OK dengan menggunakan metode async, Task.Delay
akan 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);
}
gunakan dataGridView1.Refresh();
:)
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
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);
});
Mungkin coba kode ini:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}