dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Bu kodla grid hücrelerimi yazdırmadan önce bir saniye beklemek istiyorum ama çalışmıyor. Ne yapabilirim?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Bu kodla grid hücrelerimi yazdırmadan önce bir saniye beklemek istiyorum ama çalışmıyor. Ne yapabilirim?
Yanıtlar:
Duraklıyor, ancak hücrede kırmızı renginizin görünmediğini mi görüyorsunuz? Bunu dene:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
Şahsen ben Thread.Sleep
kötü bir uygulama olduğunu düşünüyorum . Kullanıcı arayüzünü kilitler vb. Ben şahsen beklediği için zamanlayıcı uygulamalarını seviyorum.
Kullanım: 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();
}
Zamanlayıcı kullanarak işlevi bekleyin, UI kilitleri yok.
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();
}
}
Kullanım: bunu beklemesi gereken kodunuzun içine yerleştirmeniz yeterlidir:
wait(1000); //wait one second
Sanki burada yanlış olan tek şey sıraydı, Selçuklu uygulamanın ızgarayı doldurmadan önce bir saniye beklemesini istedi, bu yüzden Uyku komutunun doldur komutundan önce gelmesi gerekiyordu.
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
.Net Core DispatcherTimer
,.
Zaman uyumsuz bir yöntem kullanmakta sorun olmazsa, Task.Delay
ihtiyaçlarımızı karşılayacaktır. Bu, hız sınırlayıcı nedenlerle bir for döngüsünün içinde beklemek istiyorsanız da yararlı olabilir.
public async Task DoTasks(List<Items> items)
{
foreach (var item in items)
{
await Task.Delay(2 * 1000);
DoWork(item);
}
}
Bu yöntemin tamamlanmasını aşağıdaki şekilde bekleyebilirsiniz:
public async void TaskCaller(List<Item> items)
{
await DoTasks(items);
}
Meşgul bekleme, kısa ise ciddi bir dezavantaj olmayacaktır. Benim durumumda, bir kontrolü yanıp sönerek kullanıcıya görsel geri bildirim verme ihtiyacı vardı (bu, bazı milisaniyeler için arka planını değiştiren panoya kopyalanabilen bir grafik kontrolüdür). Bu şekilde iyi çalışıyor:
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;
....
kullan dataGridView1.Refresh();
:)
Ana iş parçacığınızı dondurmadan beklemenin en iyi yolu Task.Delay işlevini kullanmaktır.
Yani kodunuz şöyle görünecek
var t = Task.Run(async delegate
{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
await Task.Delay(1000);
});
Bu işlevi deneyin
public void Wait(int time)
{
Thread thread = new Thread(delegate()
{
System.Threading.Thread.Sleep(time);
});
thread.Start();
while (thread.IsAlive)
Application.DoEvents();
}
Çağrı işlevi
Wait(1000); // Wait for 1000ms = 1s
Belki şu kodu deneyin:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}