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. publicstaticvoidDelayAction(int millisecond,Action action){var timer =newDispatcherTimer();
timer.Tick+=delegate{
action.Invoke();
timer.Stop();};
timer.Interval=TimeSpan.FromMilliseconds(millisecond);
timer.Start();}
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.
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 neededThread.Sleep(50);
distribution_chart.BackColor=Color.OldLace;....
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.
publicasyncTaskDoTasks(List<Items> items){foreach(var item in items){awaitTask.Delay(2*1000);DoWork(item);}}
Anda bisa menunggu selesainya metode ini sebagai berikut:
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(asyncdelegate{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor=System.Drawing.Color.Red;
dataGridView1.Refresh();awaitTask.Delay(1000);});
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
Jawaban:
Apakah itu berhenti, tetapi Anda tidak melihat warna merah Anda muncul di sel? Coba ini:
sumber
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(); }));
sumber
Tunggu fungsi menggunakan timer, tidak ada kunci UI.
Penggunaan: cukup letakkan ini di dalam kode Anda yang perlu menunggu:
sumber
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.
sumber
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:
sumber
.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.Anda bisa menunggu selesainya metode ini sebagai berikut:
sumber
gunakan
dataGridView1.Refresh();
:)sumber
Coba fungsi ini
Fungsi panggilan
sumber
Cara terbaik untuk menunggu tanpa membekukan utas utama Anda adalah menggunakan fungsi Task.Delay .
Jadi kode Anda akan terlihat seperti ini
sumber
Mungkin coba kode ini:
sumber